Webエンジニアの備忘録

およそ自己の作業メモとして残しております。

自社プロジェクトに xcprojectlint をかけてみた

知見が少なかったり、検証者がいなかったり、小さな開発現場は積極的にLinterを入れるべきだと思っています。

iOS開発をはじめてまだ1ヶ月ちょっとですが、まず最初にLinterを探しました。

プロジェクトのLinterを発見

引き継ぎプロジェクトが Objective-C だったのですが、言語のLinterは良さそうなものが見つからず、代わりにプロジェクトのLinterを見つけました。

github.com

アメックスさんがオープンソースを公開しているとは知りませんでした。 こちらはSwiftで書かれておりMacでの導入も非常に簡潔で、さくっと仕掛けられました。

導入方法について

何人かの方がすでに書かれていたので、記事を拝見させていただきました。 こちらで事足りると思いますので割愛します。

qiita.com techblog.lclco.com

実行

今回は業務上引き継いだおよそ4年もののプロジェクトにて検証をかけます。 ただし会社のコードはさらせないので、エラー、キャプチャ等のサンプルは比較的リアルな再現と思ってください(笑)

./xcprojectlint --report error --validations all --project awesome.xcodeproj

結果

初回実行で 219項目 もの指摘をされました…これは心が折れます\(^o^)/

検査対象である xcodeproj の中身はそもそもテキストエディタではあまり扱わない場所なため、解決には骨が折れました…(^_^;)

問題を分類するため、以下のような手順に切り替えました。

対応

チェックの際、 オプションを刻む実行 に切り替えました。

f:id:tak_taniguchi:20181117123520p:plain

xcprojectlint は5つ内容をチェックしてくれます。 初回実行では --validations all で実行してしまったのですべての検証が行われました。

以下の順序に切り替えます。

1. empty-groups

空のグループを検出してくれます。こちらも不要なものは削除していきます。 一番わかり易いのでこちらから対応しました。

error: Xcode folder “awesome/samples” has no children.

2. items-in-alpha-order

ファイルの並び順がフォルダ・ファイルのアルファベット順であることをチェックします。

error: Xcode folder “awesome/controllers” has out-of-order children.
Expected: ["comment", "friend", "game", "menu", "shared"]
Actual:   ["shared", "comment", "menu", "game", "friend"]

Expected があるべき並び方となっていますが、Xcodeのソートを利用するとフォルダ・ファイルを区別せずに名前順になります。ここは若干手作業が必要になりました。

f:id:tak_taniguchi:20181117112535p:plain

3. files-exist-on-disk

実ファイルが存在しないものを教えてくれます。ナビゲータ上でレファレンスが赤字になっている箇所ですね。こちらはリファレンスを消していくことで解消します。

New type found: ["versionGroupType": wrapper.xcdatamodel, "path": awesome.xcdatamodeld, "isa": XCVersionGroup, "sourceTree": <group>, "children": <__NSArrayM 0x1234567890A>(
1234567890ASDFGHJKLQWER
)
, "currentVersion": 1234567890ASDFGHJKLQWER]

イニシャルコミットで作られたものの、利用されずにファイルだけ消されたような形跡がいくつかありました。

4. disk-layout-matches-project

実ファイルの所在とナビゲータの配置がマッチしているか確認してくれます。 先頭にどのファイル名、フォルダ名が表示されますが、パスは表示されないのでこちらも少し頑張って検索しながら調整していく感じです(^_^;)

error: File “TopViewController.m” (1234567890ASDFGHJKLQWER) is misplaced on disk, or wrong kind of reference.
error: Folder “items” (1234567890ASDFGHJKLQWER) is misplaced on disk, or wrong kind of reference.

また、Xcodeのフォルダとグループは似て非なるもので、内包する実体との関係が少し変わってくるようです。グループが正しく設定されていない箇所を指摘されます。

グループについてはLocationにて相対グループに統一し、フォルダアイコンから実ファイルの相対パスを設定することで、ナビゲータ上のファイル移動に実ファイルも対応されるようになりました。

f:id:tak_taniguchi:20181117114501p:plain

5. build-settings-externalized

こちらが最後で最難関でした。 ビルド設定は project.pbxproj ではなく、個別ファイル(xcconfig)で管理されるのが望ましいようですが、こちらはまだ徹底できていません。

/Users/ttaniguchi/work/awesome/awesome.xcodeproj/project.pbxproj:2134: error: Pods-awesome.development.xcconfig (development) has settings defined in the project file.

なんとか5ステップを通して、8〜9割がたはLinterを通すことができました。 作業を通してナビゲータの整頓方法や、グループ、ファイルの差異、プロジェクト設定関連のファイルレイアウトを理解することができました。

Linter はこのあたりを読み解くきっかけとしても実行してみてよかったです。