web-dev-qa-db-ja.com

Xcodeのビルド構成に基づいて条件付きでファイルを含めるにはどうすればよいですか?

多数のターゲットを含むXcodeプロジェクトがあり、リリース構成ではなく、アドホックおよびデバッグ構成でビルドされたアプリの設定バンドルを含めたいと考えています。

ビルドフェーズでは、構成を条件付きにすることはできません(明らかにターゲットを条件にすることができますが、プロジェクトのターゲット数を2倍にすると、完全に使用できなくなります)。

これにより、カスタムビルドルールが作成されます。私の計画は、すべてのターゲットからSettings.bundleを除外し、それを製品パッケージに条件付きでコピーするビルドルールを作成することですが、適用可能な例を見つけるのは非常に困難です。

私が開始したビルドルールには、「名前が一致するソースファイル:」に設定されたプロセス設定と、名前としてSettings.bundleがあります。使用設定は「カスタムスクリプト:」です。

私のカスタムスクリプトは次のとおりです(私のbashスクリプトは貨物カルトレベルであることに注意してください):

if [${CONFIGURATION} = 'Debug'] then
    cp -r ${INPUT_FILE_PATH} ${DERIVED_FILES_DIR}/.
fi

最後に、${DERIVED_FILES_DIR}/Settings.bundle出力ファイルとしてリストされています。

私はここにいるので、機能していないことは明らかです。最初の質問は、ビルドルールの出力を実行として表示できる場所があるかどうかです。1)実際に実行されていること、2)どこかに愚かな構文エラーがないことを確認します。

また、出力をコピーする適切な場所(環境変数の形式)は何ですか?

72
Frank Schmitt

私はついにそれを理解しました。

条件付きで設定バンドルを含めるターゲットごとに、ソースリストからプロジェクトを選択し、ターゲットを選択して、「ビルドフェーズ」タブに切り替えます。

[ビルドフェーズの追加]ボタンをクリックし、[実行スクリプトの追加]を選択します。

次に、スクリプトに次を入力します。

if [ "${CONFIGURATION}" == "Debug" ]; then
    cp -r "${PROJECT_DIR}/Settings.bundle" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app"
fi
76
Frank Schmitt

この質問はすでに回答されており、回答は私にとって非常に役に立ちましたが、独自の修正されたソリューションもそこに放り出したいと思いました。

私の要件は、リリースでそれを含めるだけでなく、ビルド構成ごとに異なる設定バンドルを用意することでした。 DebugおよびRelease構成のみの単純なアプローチを想定して、ここに方法がありますやれ:

Settings-debug.bundleおよびSettings-release.bundleという名前の2つの設定バンドルをプロジェクトに追加してから、これらのファイルをバンドルリソースのコピービルドフェーズから削除します。次に、SETTINGS_BUNDLEというユーザー定義のビルド設定を追加します。これは、構成ごとに異なる値を持ちます。

Debug        ${PROJECT_DIR}/relative/path/to/Settings-debug.bundle
Release      ${PROJECT_DIR}/relative/path/to/Settings-release.bundle

次に、スクリプトのビルドフェーズ(バンドルリソースのコピーの後に)設定バンドルのコピーという名前を付けて、Frankのソリューションのスクリプトの修正バージョンを追加します。

cp -r "${SETTINGS_BUNDLE}/" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Settings.bundle"

ここでの違いは、コピーされたバンドルには、ソース名に関係なく、常にSettings.bundleという名前が付けられることです。

次に、変更が設定バンドルのみにある場合にコード署名エラーを防ぐために、別のビルドフェーズスクリプトを追加する必要があります。すべてのビルドでコード署名ステップを強制的に実行します。これはbeforeを実行する必要がありますソースファイルのコンパイルビルドフェーズ。私は私のものを呼んだForce Codesign

touch "${PROJECT_DIR}/relative/path/to/main.m"
44
Ell Neal

準拠したソースの場合、追加が可能な文書化されていないユーザー定義のビルド設定があります。ファイルはコンパイルから除外および含めることができます

ターゲットのビルド設定に移動し、+ボタンをタップして、ユーザー定義の設定を追加します

キーはINCLUDED_SOURCE_FILE_NAMESまたはEXCLUDED_SOURCE_FILE_NAMES

値は、スペースで区切られたファイルパスのリストです。

リファレンスを参照してください: http://lists.Apple.com/archives/xcode-users/2009/Jun/msg00153.html

21
Kyle Redfearn

Settings.bundleは、リリース構成かデバッグ構成かに関係なく、常に宛先領域にコピーされます。したがって、次のコードが必要になる場合があります。

if [ ${CONFIGURATION} == "Release" ]; then
    rm -rf ${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Settings.bundle
fi
7
Allen

私はシェルスクリプトの専門家ではありませんが、角括弧と条件の間にはスペースが必要だと思います。また、変数を引用することも役立ちます。

if [ "${CONFIGURATION}" = "Debug" ] then
    cp -r "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}"/.
fi

場所については、OS Xアプリバンドルのルートに"$BUILT_PRODUCTS_DIR"/"$FULL_PRODUCT_NAME"を使用します。

3
Stephen Chu

Xcode 9.3でテスト済み)

Xcodeにこの機能が含まれていたときはわかりませんが、EXCLUDED_SOURCE_FILE_NAMESBuild Settings > Build Options > Excluded Source File Namesで直接利用できるようになりました。

したがって、User-Defined Settingを作成する必要はなくなりました。

下記参照: - enter image description here

この行が.pbxprojに自動的に追加されます。 enter image description here

3
Toldy