在Xcode 10脚本构建阶段中如何使用文件列表(.xcfilelist)?

时间:2018-12-13 22:35:38

标签: xcode shell sh xcode10

从Xcode 10开始,构建脚本阶段可以使用文件列表(.xcfilelist)进行输入和输出,而不必直接指定输入/输出文件。这些文件似乎支持注释(WWDC示例在顶部显示命令行注释),空白行(也在示例中),否则期望每行一个文件路径。如果这些文件包含构建设置(例如$(SRCROOT)),则会在调用脚本之前对其进行扩展,就像如果直接将文件路径指定为输入/输出文件那样对它们进行扩展一样。

这听起来像是一个很棒的功能,但是您将如何在实际脚本中使用这些文件列表?

直接指定文件时,您具有外壳变量SCRIPT_INPUT_FILE_COUNTSCRIPT_OUTPUT_FILE_COUNT,然后每个输入/输出文件都有一个变量,分别名为SCRIPT_INPUT_FILE_#SCRIPT_OUTPUT_FILE_#,其中{ {1}}曾经是一个递增计数数字。假设您有相等数量的输入/输出文件,此脚本将全部打印它们:

#

这是一个干净的POSIX兼容shell脚本,是的,您可以在需要#!/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 时使其变得更好,但是上面的代码应该与每个bash兼容shell一起使用(使用{ {1}}而非sh)。

但是使用文件列表时,#!/bin/sh为0。取而代之的是,您得到#!/bin/bashSCRIPT_INPUT_FILE_COUNT以及变量SCRIPT_INPUT_FILE_LIST_COUNTSCRIPT_OUTPUT_FILE_LIST_COUNT,其中包含路径到预处理的文件列表,其中所有注释和空白行均已删除,所有构建设置均已扩展。

现在,我该如何在脚本中使用这些文件列表?上面的微小示例脚本如何使用Xcode中的文件列表产生相同的输出?我不太擅长shell脚本编写,我正在寻找一种干净的解决方案,该解决方案只需要SCRIPT_INPUT_FILE_LIST_#就不需要任何其他脚本解释器。

1 个答案:

答案 0 :(得分:0)

我不知道有一种方法可以访问shellscript中的文件列表本身。但是,文件列表的想法是,理想情况下,无论有多少文件,都具有一个文件列表。因此,我通常将其硬编码为与xcode相同的值。有点重复,但不是很多:

set -e
while read file; do
    EXPANDED=`eval echo "$file"`
    echo "do something with $EXPANDED"
done <"${SRCROOT}/path/to/files.xcfileslist"

作为此read设备的副作用,我们去除了空格并进行了其他一些光处理。如果您对如何实现这种方法很确定,请参阅this SO answer

我相信大多数(全部?)构建设置都作为环境变量导出到脚本中。因此,通过在此处使用eval对其进行评估,我们可以对其进行扩展。

使用eval可能会导致恶意文件列表执行代码。再一次,它可能与您正在执行的构建脚本位于同一位置,因此我不确定这是一个非常实际的问题。其他外壳具有解决此问题的更安全的方法,但是我不知道针对香草sh和默认macOS的任何操作。