【发布时间】:2019-05-15 05:05:12
【问题描述】:
从 Xcode 10 开始,构建脚本阶段可以使用文件列表 (.xcfilelist) 进行输入和输出,而不是直接指定输入/输出文件。这些文件似乎支持 cmets(WWDC 示例在顶部显示命令行 cmets)、空行(也在示例中),否则每行需要一个文件路径。如果这些文件包含构建设置(例如$(SRCROOT)),它们会在调用脚本之前展开,就像直接将文件路径作为输入/输出文件给出时它们会被展开一样。
这听起来像是一个很棒的功能,但是您将如何在实际脚本中使用这些文件列表?
当直接指定文件时,您有 shell 变量 SCRIPT_INPUT_FILE_COUNT 和 SCRIPT_OUTPUT_FILE_COUNT,然后每个输入/输出文件都有一个变量,命名为 SCRIPT_INPUT_FILE_# 和 SCRIPT_OUTPUT_FILE_#,其中 # 曾经是一个 up-数数。假设您有相同数量的输入/输出文件,此脚本将全部打印出来:
#!/bin/sh
: $((i=0))
while [ $i -lt "$SCRIPT_INPUT_FILE_COUNT" ]
do
eval fileIn="\$SCRIPT_INPUT_FILE_${i}"
eval fileOut="\$SCRIPT_OUTPUT_FILE_${i}"
echo "$fileIn --> $fileOut"
: $((i=i+1))
done
这是一个干净的 POSIX 兼容 shell 脚本,是的,你可以在需要 bash 时让它变得更好,但上面的代码应该适用于每个 sh 兼容 shell(它也承诺在使用 #!/bin/sh 而不是#!/bin/bash)。
但是当使用文件列表时,SCRIPT_INPUT_FILE_COUNT 为 0。取而代之的是 SCRIPT_INPUT_FILE_LIST_COUNT 和 SCRIPT_OUTPUT_FILE_LIST_COUNT,以及变量 SCRIPT_INPUT_FILE_LIST_# 和 SCRIPT_OUTPUT_FILE_LIST_#,包含到预处理文件列表的路径,其中所有cmets 和空行已被剥离,所有构建设置已被扩展。
现在,我将如何在我的脚本中使用这些文件列表?上面的小示例脚本如何使用 Xcode 中的文件列表产生相同的输出?我不太擅长 shell 脚本,我正在寻找一个干净的解决方案,它不需要任何其他脚本解释器,但 sh。
【问题讨论】: