2011-12-13 44 views
59

我有一個包含大量目標的Xcode項目,我希望在Ad-hoc和Debug配置下構建的應用程序包含一個設置包,但不包含在Release配置下。如何在Xcode中有條件地包含基於構建配置的文件?

構建階段似乎不允許使自己成爲條件的配置(他們顯然可以有條件的目標,但倍增項目中的目標數量將使其完全無法使用)。

這留下了編寫自定義生成規則。我的計劃是將Settings.bundle從所有目標中排除,並創建一個構建規則,將其有條件地複製到產品包中,但很難找到適用的示例。

我已經開始的構建規則將Process設置設置爲「Source names with namesmatching:」和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

我不是shell腳本專家,但我認爲你需要在方括號和條件之間的空格。此外,引用變量可能會有幫助:

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

至於位置,我用"$BUILT_PRODUCTS_DIR"/"$FULL_PRODUCT_NAME"我的OS X應用程序包的根。

+0

這給我的語法錯誤,當我建立。弗蘭克的解決方案,複製和粘貼,完美運作。 – Lance 2013-08-26 20:41:33

+1

爲了完全公平,這傢伙的答案在三個月前發佈。 – Puppy 2015-09-29 15:32:24

38

我知道這個問題已經被回答,答案對我非常有幫助的,但我想扔我自己修改的方案在那裏,以及。

我的要求是爲不同的構建配置使用不同的設置捆綁包,而不是在發佈時不包括它。假設只有調試發佈配置的簡單的方法,這裏是如何做到這一點:

開始加入2個設置捆綁項目,命名爲Settings-debug.bundleSettings-release.bundle,然後從複製包資源刪除這些文件構建階段。接着添加一個用戶定義的構建設置稱爲SETTINGS_BUNDLE,其對於每個配置具有不同的值:

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

接着添加一個運行腳本生成階段(後複製包資源)命名爲複印設置捆綁與經修飾的弗蘭克解決方案中的腳本版本。

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

的此不同的是,複製的包總是被命名爲Settings.bundle不管源名稱。

然後,您需要添加另一個構建階段腳本,以防止代碼簽名錯誤,當設置包中僅有更改時。它強制代碼簽名步驟發生在每個版本上。這應該運行之前編譯源文件構建階段。我打電話給我Force Codesign

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

內置設置應用程序中的僅調試應用程序首選項窗格的絕佳解決方案,這正是我以前的做法。非常感謝你! – benvolioT 2014-07-07 05:11:10

+4

你也可以寫: CP -r 「$ {} PROJECT_DIR/settings_bundle /設置 - $ {}配置.bundle /」 「$ {BUILT_PRODUCTS_DIR}/$ {PRODUCT_NAME}。應用程序/ Settings.bundle」 這將讓你避免添加任何用戶定義的生成條目,並將使用文件的'settings_bundle/Settings-Debug.bundle','settings_bundle/Settings-Release.bundle'等 – 2014-09-01 07:30:08

6

無論Release或Debug配置如何,Settings.bundle總是被複制到目標區域。所以,也許你需要下面的代碼:

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

對於遵守的來源,有一個記錄不完善的用戶定義的生成設置,可以添加。文件既可以排除包括來自編譯

轉到您的目標的生成設置>點擊+按鈕>添加用戶定義的設置

的關鍵是要麼INCLUDED_SOURCE_FILE_NAMESEXCLUDED_SOURCE_FILE_NAMES

的值是一個空間文件路徑分隔列表

見參考文獻: http://lists.apple.com/archives/xcode-users/2009/Jun/msg00153.html

相關問題