Xcode
iOS
Swift
xcprojectlint

XCodeプロジェクトのLintツール xcprojectlint

はじめに

XCodeで開発をしていると以下のような課題が出てくると思います。

  • XCodeで見えているディレクトリ構造と、ファイルシステム上のディレクトリ構造が違う
  • ディレクトリ、ファイルがアルファベット順になっていないので、ファイルが探しづらい
  • ファイルの参照リンクが切れている

こうした課題を解決するのに便利なツールがxcprojectlintです。
https://github.com/americanexpress/xcprojectlint

インストール

プロジェクトをクローンしてビルドします。

$ git clone https://github.com/americanexpress/xcprojectlint.git
$ cd xcprojectlint
$ swift package update
$ make build

ビルドが完了すると、./.build/x86_64-apple-macosx10.10/debug/xcprojectlintというパスにバイナリが作成されます。

Lintを実行する

以下のコマンドで、xcprojectlintに定義されている全てのルールについてチェックをすることができます。

$ ./.build/x86_64-apple-macosx10.10/debug/xcprojectlint \
    --report error \
    --validations all \
    --project /path/to/ExampleProject/Example.xcodeproj

特定のルールのみ有効にしたい場合は、--validationsにスペース区切りでルール名を指定します。

$ ./.build/x86_64-apple-macosx10.10/debug/xcprojectlint \
    --report error \
    --validations disk-layout-matches-project items-in-alpha-order \
    --project /path/to/ExampleProject/Example.xcodeproj

ルール一覧

本記事執筆時点では以下の6つのルールが用意されています。

  • build-settings-externalized: Build Settingsがproject.pbxprojではなく個別の*.xcconfigで管理されているかをチェックする
  • disk-layout-matches-project: ディレクトリ・ファイルのレイアウト(パス)について、XCodeで見えているレイアウト(パス)とファイルシステム上のレイアウト(パス)が一致しているかをチェックする
  • files-exist-on-disk: XCode上のファイルが参照しているパスにファイルが存在するか(リンクが切れていないかどうか)をチェックする
  • empty-groups: ファイルがない空のディレクトリ(グループ)があるかどうかチェックする
  • items-in-alpha-order: ディレクトリ・ファイルがアルファベット順に並んでいるかをチェックする
  • all: 全てのルールをチェックする

XCodeでアプリのビルド時にxcprojectlintを実行する

Swiftlintなどの他のLintツールと同様に、ビルド時にxcprojectlintを実行できると便利です。

まず、xcprojectlintバイナリファイルをXCodeプロジェクトにコピーしておきます。

$ copy ./.build/x86_64-apple-macosx10.10/debug/xcprojectlint /path/to/ExampleProject

メインターゲットのBuild Phasesに、xcprojectlintを実行するRun Scriptを追加します。

image.png

if which "${PROJECT_DIR}/xcprojectlint" >/dev/null; then
  "${PROJECT_DIR}/xcprojectlint" --report error --validations build-settings-externalized --project ${PROJECT_DIR}/Example.xcodeproj
else
  echo "warning: ${PROJECT_DIR}"
  echo "warning: xcprojectlint not installed"
fi

これで、アプリのビルド時にxcprojectlintによるチェックが行われます。

error.png