Xcode 13构建报错:输入文件在构建过程中被修改问题求助
问题根因
该问题是Xcode 13新构建系统的已知校验逻辑变更导致的:Xcode 13强化了构建过程中输入输出文件的修改时间校验,即使生成的Swift文件被标记为构建阶段的输出文件,只要没有正确配置输入输出文件列表,构建系统会误将脚本生成过程中的文件修改判定为外部非法修改,触发冲突报错。当代码生成阶段位于作为主应用依赖的扩展target上时,并行构建逻辑会进一步提升校验冲突的触发概率。
可行解决方案
按优先级依次尝试以下方案:
- 补全构建阶段的输入输出文件列表:
所有代码生成构建阶段,必须将生成的目标文件完整路径填写到**输出文件列表(Output Files)中,而非仅填写单个输出文件栏;如果脚本依赖配置文件(如Swiftgen的swiftgen.yml、Sourcery的配置文件等),需要将配置文件路径填写到输入文件列表(Input Files)**中。Xcode 13的校验逻辑会优先识别列表配置,明确文件归属的构建阶段后就不会误判修改行为。 - 调整构建阶段执行顺序:
将所有代码生成构建阶段拖动到target的「Compile Sources」阶段最前方,确保所有代码生成动作在Swift编译任务启动前全部完成,避免编译阶段已经开始读取文件时,生成脚本还在写入文件的时间差冲突。 - 关闭扩展target的并行构建选项:
选中Notification Service Extension target,进入「Build Settings」页,找到「Parallelize Build」选项设置为NO,避免扩展和主应用的构建任务并行执行时重复触发文件校验。 - 脚本末尾强制更新文件时间戳:
在所有代码生成的shell脚本末尾,添加touch -cm 生成文件的完整路径命令,示例如下:
强制刷新文件的修改时间戳,让构建系统明确识别到文件是当前构建阶段内合法生成的产物。touch -cm "${SRCROOT}/YourProjectPath/Secrets+Generated.swift" - 可选兜底方案:
如果以上方案仍无法解决偶发报错,在扩展target的「Build Settings」中找到「User Script Sandboxing」选项,设置为NO。Xcode 13默认开启的用户脚本沙箱限制会干预脚本对输出文件的写入权限,关闭后可规避权限相关的校验冲突。
内容的提问来源于stack exchange,提问作者ChaosCoder
相关产品推荐
相关产品推荐

