私はそのスクリプトを持っています
そして、makeターゲットとして特別なタイムスタンプファイルを持ち、ターゲットソースとして構成ファイルを持つMakefile:
SRC = $(Shell find ../config -iname "*.txt")
STAMP = $(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME).stamp
$(STAMP): $(SRC)
python inject.py
touch $(STAMP)
プロジェクトターゲットのビルドフェーズのスタックの最上部に、このMakefileを「Run Script Build Phase」として追加しました。
スクリプトビルドフェーズは、ソースをコンパイルする前に実行されました。
ただし、スクリプトは実行中にソースコードを変更するため、ビルド製品の最新バージョンを取得するためにtwiceをビルドする必要がありました。これが私が想像していることです。
ビルドフェーズに関するXcodeドキュメント を読んだ後、スクリプトが「スクリプトビルドフェーズの実行」の出力として実行されるたびに更新されることがわかっているソースファイルを追加しようとしましたが、何も変わりませんでした。構成ファイルの数はプロジェクトによって異なる場合があるため、すべての入力ファイルと出力ファイルを指定する必要はありません。
「スクリプトビルドフェーズの実行」中に行われたソースファイルの変更をXcodeに認識させるにはどうすればよいですか?
これまでに説明したすべてのテクニックは過剰です。 steve kim の可視性に関するコメントの再現:
[ビルドフェーズ]タブで、[スクリプトの実行]ステップをより高い場所(たとえば、[ソースのコンパイル]の前)にドラッグします。
XCode 6でテスト済み
このソリューションはおそらく時代遅れです。代わりに上位の回答を参照してください。
「外部ターゲット」を使用:
これで、新しい「外部ターゲット」が実行されますbeforeメインターゲットは依存関係情報の収集を開始するので、スクリプトの実行中に行われた変更はビルドに含まれます。
別のターゲットを必要としないもう少しシンプルなオプションがありますが、スクリプトが毎回同じソースファイルを変更する傾向がある場合にのみ実行可能です。
まず、ターゲットアプリに反映された特定の変更を確認するために、Xcodeで2回ビルド(またはクリーンビルド)が必要になる場合がある理由について混乱している人のための簡単な説明を以下に示します。 Xcodeは、生成するオブジェクトファイルが見つからない場合、またはオブジェクトファイルの最終変更日がソースファイルの最終変更日よりも早い場合、ソースファイルをコンパイルします最初のビルドフェーズの開始時。プロジェクトがプリコンパイルビルドフェーズでソースファイルを変更するスクリプトを実行する場合、Xcodeはソースファイルの最終変更日が変更されたことに気付かないため、それを再コンパイルする必要はありません。 Xcodeが日付の変更に気付き、ファイルを再コンパイルするのは、プロジェクトを2回目にビルドするときだけです。
スクリプトが毎回同じソースファイルを変更する場合の簡単なソリューションを次に示します。 Run Scriptビルドフェーズを追加するだけですビルドプロセスの最後このように:
touch Classes/FirstModifiedFile.m Classes/SecondModifiedFile.m
exit $?
ビルドプロセスの最後にこれらのソースファイルでtouch
を実行すると、オブジェクトファイルよりも最終更新日が常に遅くなることが保証されるため、Xcodeは毎回それらを再コンパイルします。
Xcode 4では、生成されたファイルをビルドフェーズの出力セクションに追加すると、その設定が尊重され、... has been modified since the precompiled header was built
エラーメッセージ。
これは、スクリプトが毎回少数のファイルのみを生成する場合に適したオプションです。
私もこれに長い間苦労しました。答えは、entoの「外部ターゲット」ソリューションを使用することです。彼は、なぜこの問題が発生し、実際にどのように使用するのか...
Xcode4ビルドステップは、plistがコンパイルされるまで実行されません。もちろん、これはばかげています。なぜなら、plistを変更するビルド前の手順は有効にならないからです。しかし、あなたがそれについて考えるなら、それらは実際に有効になります...次のビルドで。そのため、一部の人々はplist値の「キャッシュ」または「機能させるには2つのビルドを行う必要があります」について話しました。何が起こるかというと、plistがビルドされ、スクリプトが実行されます。次回のビルドでは、変更されたファイルを使用してplistがビルドされるため、2番目のビルドになります。
entoのソリューションは、実際にビルド前のステップを実際に行うことがわかった1つの方法です。残念ながら、クリーンビルドなしではplistが更新されないこともわかったので、修正しました。 plistにデータ駆動型のユーザー値がある方法は次のとおりです。
メインアプリのplistファイルをタッチすると、メインターゲットが毎回plistを生成します。ビルド設定をパラメーターとして渡す理由は、コマンドラインビルドが設定をオーバーライドできるようにするためです。
pythonスクリプトは、基本設定ファイルを使用し、ユーザー定義の設定ファイルがデフォルトをオーバーライドできるようにします。変更を加えると、すぐにplistになります。これは、それ以外の場合は、労力の無駄です...代わりにjsonファイルなどを生成し、実行時にロードします:)
これがお役に立てば幸いです...これを理解するのに数日は苦労しました。