LoginSignup
25
12

More than 5 years have passed since last update.

Xcode 10 で外部ライブラリーなどの利用による自動生成のファイルがある場合、ビルドが通らず CI でコケる場合の対応

Posted at

TL;DR

要するにビルドシステムが変わってファイル管理の仕様が変わったからです

説明

Xcode 10 の移行により、今まで何の問題もなく動くし、ローカルでもビルドやテストが無事成功するのに、CI 側だけなぜか通りませんでした(もちろん CI 側の設定はすでに Xcode 10 に移行済み)。

通らない理由は Build input files cannot be found: '.../Xxx.xxx' でした。

もし上記の Xxx.xxx の部分は外部ライブラリーによる自動生成するファイルで、このファイルは .gitignore の設定によりバージョン管理外に置いてあるのでしたら、それはすなわちこのファイルがまだ生成されていないのに、Xcode が先に入力ファイル確認し始め、ファイルが見つからないことによってビルドがコケると言うことです。

この仕様に関しては Xcode 10 のビルドシステムリリースノート に書かれてあります:

If an output file which is generated by a shell script is used as an input elsewhere in the build (for example, to another shell script), then that output must be declared as an explicit output by the script that generates it; otherwise the build system may attempt to search for the file before it has been generated, causing the build to fail.
(訳:もしシェルスクリプトによって生成されるファイルがビルド時の別のどこかで入力ファイルとして使われる場合(例えば別のシェルスクリプトとか)、その生成されるファイルは明示的に「出力」としてそのシェルスクリプトの設定に記載しなければなりません;でなければビルドシステムはファイルが生成される前にサーチしますので、ビルドエラーが発生します。)

まあ言ってることはわかるが「明示的に記載」ってどう言うことやねん?っと色々ググってみたけど特に有益な情報が見つからず、しゃーないなと思ってとりあえずその設定のところで出力先のパスを追加してみたら、無事 CI が通りました(ローカルでも自動生成されるファイルをビルド前に手動で消せば確認できます)。

具体的にどこかと言うとここです:
スクリーンショット 2018-09-21 15.49.02.png

今やってるプロジェクトで DIKit を利用していますが、これもまさに依存を自動生成で書き出しています。

と言うわけで皆さんも Xcode 10 対応頑張りましょう :muscle:

25
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
12