XCConfig 语法

XCConfig syntax

如果我在 Adhoc.xcconfig 中定义了一个变量:

PREPROCESSOR_DEFINITIONS = IS_ADHOC=1 CRASHLYTICS=1

并且在 运行 脚本中,有一个看起来像这样的检查:

if [ "${PREPROCESSOR_DEFINTIONS/CRASHLYTICS=1}" = "$PREPROCESSOR_DEFINITIONS" ] ; then
    echo "Crashlytics is disabled, skipping Crashlytics dSYM upload"
else
    echo "Crashlytics is on"
end

if 语句检查什么?我不清楚 / 是特定于 bash 还是 xcconfig 的语法。同样令人困惑的是,if 语句正在检查使用 = 而不是 == 的赋值结果。

逐条分解 if 语句:

任何人都可以阐明该语法以及 if 语句试图完成什么,那就太好了。

这都是关于 bash,而不是 xcconfig 文件。 xcconfig 文件仅建立构建设置。默认情况下,构建设置作为环境变量导出到 运行-script 构建阶段。这是两人之间唯一的关系。 xcconfig 文件的格式仅在读取 xcconfig 文件时相关。

来自 bash 手册页关于参数扩展的部分:

${parameter/pattern/string}

The pattern is expanded to produce a pattern just as in pathname expansion. Parameter is expanded and the longest match of pattern against its value is replaced with string. […] If string is null, matches of pattern are deleted and the / following pattern may be omitted. […]

因此,"${PREPROCESSOR_DEFINTIONS/CRASHLYTICS=1}" 扩展了 PREPROCESSOR_DEFINTIONS 但从结果字符串中删除了 CRASHLYTICS=1 的所有实例。

单个=不是赋值。是等号比较。 Bash 也支持 == 但是,正如手册页所说:

= may be used in place of == for strict POSIX compliance.

所以,从技术上讲,= 是更标准的。

因此,if 正在测试 PREPROCESSOR_DEFINTIONS 是否不包含 CRASHLYTICS=1。如果确实包含它,那么删除 CRASHLYTICS=1 的扩展将不等于未修改的扩展。

当然,考虑到 if.

的每个分支中的 echo 语句,这是有道理的