83

我有一个包含大量目标的 Xcode 项目,我想在其中包含一个设置包,用于在 Ad-hoc 和 Debug 配置下构建的应用程序,但不在 Release 配置下。

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

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

我开始的构建规则将 Process 设置设置为“名称匹配的源文件:”并将 Settings.bundle 作为名称。使用设置是“自定义脚本:”。

我的自定义脚本如下(需要注意的是我的 bash 脚本处于货物崇拜级别):

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

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

既然我在这里,应该很明显它不起作用。我的第一个问题是我是否可以在某个地方查看构建规则的输出作为执行,以确保 1)它实际上正在执行,并且 2)我在某处没有愚蠢的语法错误。

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

4

6 回答 6

87

我终于弄明白了。

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

单击“添加构建阶段”按钮并选择“添加运行脚本”。

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

if [ "${CONFIGURATION}" == "Debug" ]; then
    cp -r "${PROJECT_DIR}/Settings.bundle" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app"
fi
于 2012-02-09T23:07:23.957 回答
50

我知道这个问题已经得到解答,而且答案对我很有帮助,但我也想把我自己的修改后的解决方案扔出去。

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

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

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

接下来添加一个名为Copy Settings Bundle的运行脚本构建阶段(在Copy Bundle Resources之后) ,其中包含 Frank 解决方案中脚本的修改版本。

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

此处的区别在于,无论源名称如何,复制的包始终命名为Settings.bundle 。

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

touch "${PROJECT_DIR}/relative/path/to/main.m"
于 2013-10-10T14:06:37.393 回答
29

对于已编译的源,可以添加一个记录不充分的用户定义的构建设置。文件可以从编译中排除和包含

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

关键是INCLUDED_SOURCE_FILE_NAMES要么EXCLUDED_SOURCE_FILE_NAMES

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

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

于 2016-04-07T16:40:32.023 回答
11

(使用Xcode 9.3测试)

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

因此,您不再需要创建User-Defined Setting.

见下文: 在此处输入图像描述

它会自动将此行添加到您的.pbxproj. 在此处输入图像描述

于 2018-04-24T11:45:41.280 回答
8

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

if [ ${CONFIGURATION} == "Release" ]; then
    rm -rf ${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Settings.bundle
fi
于 2014-07-30T03:47:49.187 回答
4

我不是 shell 脚本专家,但我认为您需要方括号和条件之间的空格。此外,引用变量可能会有所帮助:

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

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

于 2011-12-13T22:55:46.310 回答