XCConfig语法

时间:2017-02-24 23:17:44

标签: ios xcode xcconfig

如果我有一个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语句:

  • "${PREPROCESSOR_DEFINITIONS}/CRASHLYTICS=1}" - 是一个变量扩展。

  • / - 是否将较大的变量PREPROCESSOR_DEFINTIONS编入索引以检查CRASHLYTICS变量是否存在?

  • = "$PREPROCESSOR_DEFINITIONS" - 这只是将此字符串文字分配给前一个表达式的结果吗?

任何可以阐明该语法以及if语句试图完成的内容的人都会很棒。

1 个答案:

答案 0 :(得分:1)

这完全是关于bash,而不是xcconfig文件。 xcconfig文件仅建立构建设置。默认情况下,构建设置将作为环境变量导出到运行脚本构建阶段。这是两者之间的唯一关系。 xcconfig文件的格式仅在读取xcconfig文件时才有意义。

从参数扩展的bash手册页部分:

  

$ {参数/模式/字符串}

     

扩展模式以生成模式,就像在路径名扩展中一样。 参数已展开, pattern 与其值的最长匹配将替换为 string 。 [...]如果 string 为null,则删除 pattern 的匹配项,并且可以省略/ follow pattern 。 [...]

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

=不是作业。这是等于比较。 Bash也支持==但是,正如手册页所说:

  

=可用于代替==以严格遵守POSIX。

因此,从技术上讲,=更为标准。

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

当然,鉴于echo的每个分支中的if语句,这是有道理的。