20200204のGitに関する記事は1件です。

iOSでビルド時に自動生成するソースコードをGitで管理しないために

はじめに

iOSアプリ開発において、リソースにタイプセーフにアクセスするためのソースコードを自動生成する SwiftGenR.swift のようなツールをよく利用すると思いますが、みなさんはその自動生成されたソースコードは Git 管理下においていますか?

私の開発中のアプリではこれまで Git 管理下においていたのですが、アプリの要件により次のような状況になりました。

  • Build Configuration に応じて自動生成されるコードに違いが出るようになった
  • ソースコード以外にも Build Configuration に応じてアプリにバンドルさせるファイルを切り替える必要性がでてきた

このような状況ですと、Build Configuration によってファイルが変化してしまうため、ビルド時に自動生成するファイルは Git 管理下におかないようにしました。が、その中でつまづきポイントがあったのでメモとして残します。

Git 管理外にすると...

Git コマンドで自動生成ファイルを Git 管理対象外にします。

$ git rm path/to/Generated/file

Xcode プロジェクトツリー上ではそのファイルが赤色で表示され、存在しないことがわかります。
Xcodeプロジェクトツリー/存在しないファイル

そして、自動生成されてもコミット対象にならないよう、.gitignore ファイルに自動生成先ディレクトリを追加しました。

.gitignore
path/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 SwiftGenCompile Sources よりも前のタイミングになっていないので問題なさそうです。
Xcodeプロジェクト/Build Phases

プロジェクトツリー上のファイルの存在チェックはこの Build Phases よりも前のタイミングで実施されるのでしょうか?

解決策

いろいろと調べて R.swift リポジトリのこの issue にたどり着きました。

First build always fails using the new build system with Xcode 10 Beta 6

どうやら Build Phases で生成されたファイル等は青果物として明示してあげる必要がありそうです。ということで先程の Run SwiftGenOutput Files に自動生成されるファイルのパスを追加しました。
Xcodeプロジェクト/Build Phases/Run SwiftGen

これにより、自動生成される前の状態でのXcodeプロジェクトツリー上での表示もこのように変わりました!ファイルアイコンは半透明のままですが、ファイル名は赤色ではなくなっています。
Xcodeプロジェクトツリー/存在しないファイル2

もちろん、ビルドも問題なく通るようになりました :thumbsup:

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む