如何在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.bundle
和Settings-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_NAMES
或EXCLUDED_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应用程序包的根目录。