Xcode 13 错误:输入文件 [...] 在构建期间被修改

Cha*_*der 41 xcode swift xcode13

Xcode 13 让我很难构建我的项目,该项目由具有生成代码的构建阶段的目标组成。

例如,一个构建阶段Secrets+Generated.swift只需使用将某些代码回显到该文件中的 shell 脚本即可生成该文件。

在此输入图像描述

构建阶段将该文件定义为输出文件。没有输入文件,没有输入文件列表,也没有输出文件列表,因为只创建/修改了一个文件。

构建项目时几乎总是会失败:

error: input file '[ProjectPath]/Secrets+Generated.swift' was modified during the build
error: input file '[ProjectPath]/Secrets+Generated.swift' was modified during the build
Command CompileSwiftSources failed with a nonzero exit code
Run Code Online (Sandbox Code Playgroud)

有人遇到过这个问题或者知道该怎么办吗?我尝试切换“基于依赖性分析”复选框,但这没有帮助。我在使用 Xcode 12 时没有遇到这个问题。有趣的是,尽管只有一个构建阶段生成该特定文件,但还是出现了重复的错误消息。

顺便提一句。当使用swiftgenSourceryCuckoo等代码生成工具时,我遇到了同样的问题。

编辑:这是我的构建阶段: 在此输入图像描述 三个标记的构建阶段都会生成一个这样的文件。他们都偶尔会失败。我不知道这是否有什么不同,但这些只是为一个目标(通知服务扩展)定义的,它是我的主应用程序目标的依赖项,因此当我构建应用程序时它只会触发一次。

Tom*_*rst 46

我正在R.swift 中调试类似的问题,我想我已经找到了问题的原因。

Xcode 13 似乎在索引构建期间执行运行脚本构建阶段。这可能会导致索引传递与构建并行地写入文件。

要检查您是否发生这种情况,请将其添加到您的构建脚本中:say $ACTION
在 Xcode 12 上,它只显示“build”,但在 Xcode 13 中,每当我保存 .swift 文件或以其他方式导航时,我都会在编译期间听到它说“indexbuild”通过我的代码。

要防止脚本在索引期间运行,请添加以下检查:

if [ $ACTION != "indexbuild" ]; then
  # your script here 
fi
Run Code Online (Sandbox Code Playgroud)

  • 为什么不 ?`如果 [ $ACTION == "构建"]; 然后...` (4认同)
  • @malaba 还有 [ ACTION = "install" ]。当 fastlane 的gym启动构建时,它使用“install”。排除indexbuild可能更容易。 (3认同)