如其他答案所述,在 Xcode 10 之前,xcconfig 文件不能简单地继承和扩展彼此的值。但是,
从 Xcode 10 开始,xcconfig 现在可以按预期工作:$(inherited) 实际上扩展为之前定义的变量值。
当 .xcconfig 文件包含相同构建设置的多个分配时,使用 $(inherited) 或 $(<setting_name>) 的后续分配将从 .xcconfig 中的早期分配继承。旧版构建系统导致每次使用 $(inherited) 或 $(<setting_name>) 都会跳过 .xcconfig 中定义的任何其他值。要检测您的 .xcconfig 是否受到此改进的影响,在终端中运行 defaults write com.apple.dt.XCBuild EnableCompatibilityWarningsForXCBuildTransition -bool YES 将导致 Xcode 生成有关此情况的警告。
(Xcode 10 beta 1 发行说明)
例如,给定两个简单的 .xcconfig 文件:
// Generic.xcconfig
OTHER_SWIFT_FLAGS = $(inherited) -DMY_GENERIC_FLAG
// Debug.xcconfig
#include "Generic.xcconfig"
OTHER_SWIFT_FLAGS = $(inherited) -DMY_DEBUG_FLAG
假设您的项目使用 Debug.xcconfig 进行其调试配置,您将获得 -DMY_GENERIC_FLAG -DMY_DEBUG_FLAG 的预期值 OTHER_SWIFT_FLAGS。
(而不仅仅是 Xcode 9 和更早版本中的 -DMY_DEBUG_FLAG)
新的行为非常简单:$(inherited) 被先前定义的变量值(如果有)简单地替换。
所以在前面的例子中,如果我们展开#include 语句,我们会得到如下的xcconfig 文件:
// Merged xcconfig files after resolving #include
OTHER_SWIFT_FLAGS = -DMY_GENERIC_FLAG
OTHER_SWIFT_FLAGS = $(inherited) -DMY_DEBUG_FLAG
- 第一行
OTHER_SWIFT_FLAGS 的值为-DMY_GENERIC_FLAG( $(inherited) 扩展为空,因为这是我们遇到的OTHER_SWIFT_FLAGS 的第一个定义1)。
- 如果被覆盖,则在第二行
OTHER_SWIFT_FLAGS,其值现在为 -DMY_GENERIC_FLAG -DMY_DEBUG_FLAG(其先前的值 + 新添加的标志)。
在更复杂的 xcconfig 设置中,情况可能如下所示:
// First.xcconfig
OTHER_SWIFT_FLAGS = $(inherited) -DMY_FIRST_FLAG
// Second.xcconfig
OTHER_SWIFT_FLAGS = $(inherited) -DMY_SECOND_FLAG
// Last.xcconfig
#include "Generic.xcconfig"
OTHER_SWIFT_FLAGS = $(inherited) -DMY_LAST_FLAG
// Merge.xcconfig
#include "First.xcconfig"
#include "Second.xcconfig"
OTHER_SWIFT_FLAGS = $(inherited) -DMY_INTERMEDIATE_FLAG
#include "Last.xcconfig"
我们假设这次我们在配置中使用 Merge.xcconfig。
OTHER_SWIFT_FLAGS 的解析值为 -DMY_FIRST_FLAG -DMY_SECOND_FLAG -DMY_INTERMEDIATE_FLAG -DMY_GENERIC_FLAG -DMY_LAST_FLAG。
起初这可能令人惊讶,但实际上是有道理的:一旦#include 得到解决,我们就会得到这个 xcconfig:
OTHER_SWIFT_FLAGS = $(inherited) -DMY_FIRST_FLAG
OTHER_SWIFT_FLAGS = $(inherited) -DMY_SECOND_FLAG
OTHER_SWIFT_FLAGS = $(inherited) -DMY_INTERMEDIATE_FLAG
OTHER_SWIFT_FLAGS = $(inherited) -DMY_GENERIC_FLAG
OTHER_SWIFT_FLAGS = $(inherited) -DMY_LAST_FLAG
最终解析的值是最后一行定义的值,即-DMY_LAST_FLAG加上它从上一行继承的值-DDMY_GENERIC_FLAG(来自Generic.xcconfig,包含在Last.xcconfig中)等等.
请注意,当然,如果您在其中一个定义中忘记了$(inherited),您将破坏继承链并仅获取底部定义中的值,直到没有$(inherited) 的定义。
1 人们可能期望 xcconfig 文件继承以前在项目级别定义的值,但事实并非如此
? 从 Xcode 10 beta 1 开始,构建设置编辑器 GUI 似乎无法正确解析 xcconfig 文件中定义的变量的正确值,并显示这些值,就像使用 Xcode 10 之前的旧行为解析一样。我为此提交了 rdar://40873121 (https://openradar.appspot.com/radar?id=4925869923500032)。