You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 07:36:02