2011-12-13 8 views
59

Ad-hocとDebugの設定でビルドされたアプリケーション用の設定バンドルを含めることはできますが、リリース設定では使用できないターゲットが多数あるXcodeプロジェクトがあります。Xcodeのビルド構成に基づいて条件付きでファイルを含めるにはどうすればよいですか?

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

これで、カスタムビルドルールが書き込まれます。私の計画では、すべてのターゲットから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)どこかで愚かな構文エラーがないことを確認してください。

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

答えて

62

私はそれを最後に考え出しました。

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

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

そして、スクリプトの次のコマンドを入力します。

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

私はシェルスクリプトの専門家ですが、大括弧と条件の間にスペースが必要だと思います。また、変数は助けるかもしれ引用:場所については

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

を、私は私のOS Xのアプリケーションバンドルのルートのため"$BUILT_PRODUCTS_DIR"/"$FULL_PRODUCT_NAME"を使用しています。

+0

私はビルド時にこれが私に構文エラーが発生します。フランクのソリューションは、コピーされ貼り付けられ、完璧に機能しました。 – Lance

+1

完全に公正であるために、この男の答えは3ヶ月早く掲載されました。 – Puppy

38

私はこの質問が既に回答されている知っている、と答えは私にとって非常に有用だったが、私もそこに自分自身の修正ソリューションを投げたかったです。

私の要件は、リリース時にそれを含めないで、異なるビルド構成に異なる設定バンドルを持つことでした。唯一デバッグリリース構成の単純化したアプローチを想定すると、ここでそれを行う方法は次のとおりです。

スタートをSettings-debug.bundle命名し、Settings-release.bundle、その後コピーバンドルのリソースからこれらのファイルを削除し、プロジェクトに2つの設定バンドルを追加することにより、フェーズを構築します。

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

次は修正して設定のコピーバンドルという名前(コピーバンドルリソース後の)実行スクリプトのビルドフェーズを追加します。次の各設定で異なる値を持つ、SETTINGS_BUNDLEと呼ばれるユーザー定義のビルド設定を追加Frankのソリューションのスクリプトのバージョン。

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

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

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

touch "${PROJECT_DIR}/relative/path/to/main.m" 
+1

組み込みの設定アプリのデバッグ専用のアプリケーション環境設定パネルの素晴らしい解決策です。どうもありがとうございました!また、書くことができ – benvolioT

+4

: CP -r "$ {PROJECT_DIR}/settings_bundle /設定 - $ {} CONFIGURATION .bundle /" "$ {BUILT_PRODUCTS_DIR}/$ {PRODUCT_NAME}に.app/Settings.bundle" この意志をユーザ定義のビルドエントリを追加しないようにし、 'settings_bundle/Settings-Debug.bundle'、 'settings_bundle/Settings-Release.bundle'などのファイルを使用します。 –

+0

SETTINGS_BUNDLE変数として、$ {PROJECT_DIR}/$ {PROJECT_NAME } /Resources/Settings.bundle – Johan

6

Settings.bundleは、リリース構成とデバッグ構成のどちらに関係なく、常に宛先領域にコピーされます。追加することができの悪い文書化ユーザ定義のビルド設定があり、遵守ソースの場合

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

これは私のために働いた+1です – Brett

17

:だから、多分あなたは、次のコードが必要です。ファイルは両方の除外とターゲットのビルド設定にコンパイル

行くから含めることができます> +ボタンをタップ>ユーザー定義

キーのどちらかであるINCLUDED_SOURCE_FILE_NAMESまたはEXCLUDED_SOURCE_FILE_NAMES

値はスペースでの設定を追加します。ファイルパスの区切りリスト

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

+1

EXCLUDED_SOURCE_FILE_NAMESの追加がまだXcode 8.2..xで機能している(まだ文書化されていない)ことを確認できます –

+0

Xcode 8.2.1の作業ソリューション – cheeseRoot

関連する問題