如何在Xcode中有条件地包含基于构buildconfiguration的文件?

我有一个包含大量目标的Xcode项目,我希望在Ad-hoc和Debugconfiguration下包含应用程序的设置包,但不包括在Releaseconfiguration下。

构build阶段似乎不允许使自己成为条件的configuration(他们显然可以有条件的目标,但倍增的项目中的目标数量将使其完全无法使用)。

这留下了写一个自定义的build立规则。 我的计划是将Settings.bundle从所有目标中排除,并创build一个构build规则,将其有条件地复制到产品包中,但很难find适用的示例。

我已经开始的构build规则将Process设置设置为“Source names with names matching:”和Settings.bundle作为名称。 使用设置是“自定义脚本:”。

我的自定义脚本如下(与我的bash脚本是在一个货物邪教级别的警告):

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

最后,我将${DERIVED_FILES_DIR}/Settings.bundle列为输出文件。

由于我在这里,显然它不工作。 我的第一个问题是,是否有某处我可以查看生成规则的输出作为执行,以确保1)它实际上正在执行,并且2)我没有一个愚蠢的语法错误的地方。

另外,什么是适当的位置(以环境variables的forms)复制输出到?

我终于弄明白了。

对于您想要有条件地包含设置束的每个目标,从源列表中select其项目,select目标,然后切换到“构build阶段”选项卡。

点击“添加生成阶段”button,然后select“添加运行脚本”。

然后为脚本input以下内容:

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

我知道这个问题已经得到了答复,答案对我很有帮助,但是我想把我自己修改的解决scheme也放在那里。

我的要求是针对不同的构buildconfiguration有不同的设置捆绑,而不是在发布时不包括它。 假设一个简单的方法只有debugging发布configuration,这里是如何做到这一点:

首先将两个设置捆绑包添加到名为Settings-debug.bundleSettings-release.bundle的项目中,然后从Copy Bundle Resources构build阶段中删除这些文件。 接下来添加一个名为SETTINGS_BUNDLE的用户定义的构build设置,它对每个configuration都有不同的值:

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

接下来,在Frank的解决scheme中添加一个名为“ Copy Settings Bundle ”的运行脚本构build阶段(在Copy Bundle Resources之后 ),并使用该脚本的修改版本。

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

这里的区别在于复制的bundle总是被命名为Settings.bundle而不pipe源名称如何。

然后您需要添加另一个构build阶段脚本,以防止代码签名错误,当设置包中只有更改。 它强制代码签名步骤发生在每个构build。 这应该 编译源文件构build阶段之前运行。 我叫我的力量Codesign

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

对于符合要求的源代码,可以添加一个logging不完善的用户定义的构build设置。 文件既可以排除,也可以包含在编译中

转到您的目标的生成设置>点击+button>添加用户定义的设置

关键是INCLUDED_SOURCE_FILE_NAMESEXCLUDED_SOURCE_FILE_NAMES

该值是空格分隔的文件path列表

请参阅参考资料: http : //lists.apple.com/archives/xcode-users/2009/Jun/msg00153.html

无论是Release还是Debugconfiguration,Settings.bundle总是被复制到目标区域。 所以,也许你需要下面的代码:

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

我不是shell脚本专家,但我认为你需要在方括号和条件之间的空格。 另外,引用这些variables可能会有所帮助:

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

至于位置,我使用"$BUILT_PRODUCTS_DIR"/"$FULL_PRODUCT_NAME"作为我的OS X应用程序包的根目录。