【问题标题】:How do you use file lists (.xcfilelist) within Xcode 10 script build phases?如何在 Xcode 10 脚本构建阶段使用文件列表 (.xcfilelist)?
【发布时间】:2019-05-15 05:05:12
【问题描述】:

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

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

当直接指定文件时,您有 shell 变量 SCRIPT_INPUT_FILE_COUNTSCRIPT_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_COUNTSCRIPT_OUTPUT_FILE_LIST_COUNT,以及变量 SCRIPT_INPUT_FILE_LIST_#SCRIPT_OUTPUT_FILE_LIST_#,包含到预处理文件列表的路径,其中所有cmets 和空行已被剥离,所有构建设置已被扩展。

现在,我将如何在我的脚本中使用这些文件列表?上面的小示例脚本如何使用 Xcode 中的文件列表产生相同的输出?我不太擅长 shell 脚本,我正在寻找一个干净的解决方案,它不需要任何其他脚本解释器,但 sh

【问题讨论】:

    标签: xcode shell sh xcode10


    【解决方案1】:

    我不知道有一种方法可以在 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 会增加恶意文件列表执行代码的可能性。再说一遍,它可能与您正在执行的构建脚本位于同一个地方,所以我不确定这是一个非常实际的问题。其他 shell 有更安全的方法来解决这个问题,但我不知道任何适用于 vanilla sh 和默认 macOS 的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-25
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      • 2011-10-11
      • 2015-11-26
      相关资源
      最近更新 更多