从Xcode 10开始,构建脚本阶段可以使用文件列表(.xcfilelist
)进行输入和输出,而不必直接指定输入/输出文件。这些文件似乎支持注释(WWDC示例在顶部显示命令行注释),空白行(也在示例中),否则期望每行一个文件路径。如果这些文件包含构建设置(例如$(SRCROOT)
),则会在调用脚本之前对其进行扩展,就像如果直接将文件路径指定为输入/输出文件那样对它们进行扩展一样。
这听起来像是一个很棒的功能,但是您将如何在实际脚本中使用这些文件列表?
直接指定文件时,您具有外壳变量SCRIPT_INPUT_FILE_COUNT
和SCRIPT_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/bash
和SCRIPT_INPUT_FILE_COUNT
以及变量SCRIPT_INPUT_FILE_LIST_COUNT
和SCRIPT_OUTPUT_FILE_LIST_COUNT
,其中包含路径到预处理的文件列表,其中所有注释和空白行均已删除,所有构建设置均已扩展。
现在,我该如何在脚本中使用这些文件列表?上面的微小示例脚本如何使用Xcode中的文件列表产生相同的输出?我不太擅长shell脚本编写,我正在寻找一种干净的解决方案,该解决方案只需要SCRIPT_INPUT_FILE_LIST_#
就不需要任何其他脚本解释器。
答案 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的任何操作。