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


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

细分if语句:


"${PREPROCESSOR_DEFINITIONS}/CRASHLYTICS=1}"-是变量扩展。
/-此索引是否是较大变量PREPROCESSOR_DEFINTIONS的索引,以检查CRASHLYTICS变量是否存在?
= "$PREPROCESSOR_DEFINITIONS"-这是否只是将此字符串文字分配给先前表达式的结果?


任何可以阐明该语法以及if语句试图完成的事情的人,都很棒。

最佳答案

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

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


  $ {parameter / pattern / string}
  
  与路径名扩展一样,扩展模式以产生模式。扩展参数,并将模式与其值的最长匹配项替换为字符串。 […]如果string为null,则删除模式匹配项,并且/后面的模式可以省略。 […]


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

单个=未分配。这是平等比较。 Bash还支持==,但正如手册页所述:


  为了严格遵守POSIX,可以使用=代替==


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

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

当然,考虑到echo的每个分支中的if语句,这是有道理的。

关于ios - XCConfig语法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42449896/

10-10 14:31