はじめに
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を追加します。
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によるチェックが行われます。