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

Fra*_*itt 72 xcode build-rules

我有一个包含大量目标的Xcode项目,我希望在Ad-hoc和Debug配置下构建应用程序的设置包,但不包括Release配置.

构建阶段似乎不允许自己以配置为条件(它们显然可以以目标为条件,但是项目中目标数量加倍会使其完全无法使用).

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

我启动的构建规则将Process设置设置为"Source files with names matching:",Settings.bundle作为名称."使用"设置为"自定义脚本:".

我的自定义脚本如下(有一点需要注意我的bash脚本是在货物崇拜级别上):

if [${CONFIGURATION} = 'Debug'] then
    cp -r ${INPUT_FILE_PATH} ${DERIVED_FILES_DIR}/.
fi
Run Code Online (Sandbox Code Playgroud)

最后,我${DERIVED_FILES_DIR}/Settings.bundle列出了一个输出文件.

因为我在这里,显然它不起作用.我的第一个问题是,是否有某个地方我可以将构建规则的输出视为执行,以确保1)它实际上正在执行,以及2)我没有在某处出现愚蠢的语法错误.

另外,将输出复制到的正确位置(以环境变量的形式)是什么?

Fra*_*itt 77

我终于弄明白了.

对于要有条件地包含设置包的每个目标,从源列表中选择其项目,选择目标,然后切换到"构建阶段"选项卡.

单击"添加构建阶段"按钮,然后选择"添加运行脚本".

然后为脚本输入以下内容:

if [ "${CONFIGURATION}" == "Debug" ]; then
    cp -r "${PROJECT_DIR}/Settings.bundle" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app"
fi
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我曾经使用过管理不同配置的 firebase 项目 plist 文件的方法。 (2认同)

Ell*_*eal 43

我知道这个问题已经得到了解答,答案对我很有帮助,但我也希望将自己的修改后的解决方案推出去.

我的要求是为不同的构建配置提供不同的设置包,而不是在发布时不包括它.假设只有调试发布配置的简单方法,这里是如何做到的:

加入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
Run Code Online (Sandbox Code Playgroud)

接下来,在Frank的解决方案中添加名为Copy Settings Bundle的运行脚本构建阶段(在Copy Bundle Resources之后),该脚本具有修改后的脚本版本.

cp -r "${SETTINGS_BUNDLE}/" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Settings.bundle"
Run Code Online (Sandbox Code Playgroud)

不同之处在于,无论源名称如何,复制的bundle总是名为Settings.bundle.

然后,您需要添加另一个构建阶段脚本,以防止在设置包中发生唯一更改时出现代码签名错误.它强制代码签名步骤在每个构建上发生.这应该运行之前编译源文件生成阶段.我打电话给我的Force Codesign.

touch "${PROJECT_DIR}/relative/path/to/main.m"
Run Code Online (Sandbox Code Playgroud)

  • 您还可以写:cp -r"$ {PROJECT_DIR}/settings_bundle/Settings - $ {CONFIGURATION} .bundle /""$ {BUILT_PRODUCTS_DIR}/$ {PRODUCT_NAME} .app/Settings.bundle"这样可以避免添加任何内容用户定义的构建条目,将使用文件'settings_bundle/Settings-Debug.bundle','settings_bundle/Settings-Release.bundle'等 (4认同)
  • 而不是在复制捆绑资源构建阶段寻找文件来删除它们,只需在文件检查器中删除捆绑文件的任何目标成员资格。更快。 (2认同)

Kyl*_*arn 23

对于已编译的源,可以添加一个记录不明的用户定义的构建设置.文件可以被排除并包含在编译中

转到目标的构建设置>点击+按钮>添加用户定义的设置

关键是INCLUDED_SOURCE_FILE_NAMES或者EXCLUDED_SOURCE_FILE_NAMES

该值是以空格分隔的文件路径列表

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


Tol*_*ldy 10

(使用Xcode 9.3测试)

我找不到 Xcode 何时包含此功能,但EXCLUDED_SOURCE_FILE_NAMES现在可以直接在Build Settings > Build Options > Excluded Source File Names.

所以你不再需要创建一个User-Defined Setting.

见下文: 在此处输入图片说明

它会自动在您的.pbxproj. 在此处输入图片说明


All*_*len 7

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

if [ ${CONFIGURATION} == "Release" ]; then
    rm -rf ${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Settings.bundle
fi
Run Code Online (Sandbox Code Playgroud)