2011-12-13 143 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

相关问题