- 投稿日:2020-02-04T11:26:58+09:00
iOSでビルド時に自動生成するソースコードをGitで管理しないために
はじめに
iOSアプリ開発において、リソースにタイプセーフにアクセスするためのソースコードを自動生成する SwiftGen や R.swift のようなツールをよく利用すると思いますが、みなさんはその自動生成されたソースコードは Git 管理下においていますか?
私の開発中のアプリではこれまで Git 管理下においていたのですが、アプリの要件により次のような状況になりました。
- Build Configuration に応じて自動生成されるコードに違いが出るようになった
- ソースコード以外にも Build Configuration に応じてアプリにバンドルさせるファイルを切り替える必要性がでてきた
このような状況ですと、Build Configuration によってファイルが変化してしまうため、ビルド時に自動生成するファイルは Git 管理下におかないようにしました。が、その中でつまづきポイントがあったのでメモとして残します。
Git 管理外にすると...
Git コマンドで自動生成ファイルを Git 管理対象外にします。
$ git rm path/to/Generated/fileXcode プロジェクトツリー上ではそのファイルが赤色で表示され、存在しないことがわかります。
そして、自動生成されてもコミット対象にならないよう、.gitignore ファイルに自動生成先ディレクトリを追加しました。
.gitignorepath/to/Generatedこの状態でビルドを実行してみたところ、次のようなビルドエラーとなってしまいました。
error: Build input files cannot be found: 'path/to/Generated/Asset.swift', 'path/to/Generated/StoryboardScenes.swift', 'path/to/Generated/Strings.swift', 'path/to/Generated/StoryboardSegues.swift' (in target 'MyApp' from project 'MyApp')自動生成のタイミングを確認するも...
自動生成のタイミングがソースコードのコンパイル時に間に合っていないのかと思い、Xcode プロジェクトの Build Phases を確認してみましたが、SwiftGen を実行する Run SwiftGen は Compile Sources よりも前のタイミングになっていないので問題なさそうです。
プロジェクトツリー上のファイルの存在チェックはこの Build Phases よりも前のタイミングで実施されるのでしょうか?
解決策
いろいろと調べて R.swift リポジトリのこの issue にたどり着きました。
First build always fails using the new build system with Xcode 10 Beta 6
どうやら Build Phases で生成されたファイル等は青果物として明示してあげる必要がありそうです。ということで先程の Run SwiftGen の Output Files に自動生成されるファイルのパスを追加しました。
これにより、自動生成される前の状態でのXcodeプロジェクトツリー上での表示もこのように変わりました!ファイルアイコンは半透明のままですが、ファイル名は赤色ではなくなっています。
もちろん、ビルドも問題なく通るようになりました
![]()



