Swift项目(Xcode9/AppCode)构建时大量出现cannot remove stale file警告求因
咱们先把这个问题拆透:你遇到的这些警告,根源出在Swift构建系统的核心组件llbuild上。从你提到的llbuild相关修复记录来看,这是个典型的构建缓存状态同步偏差问题——简单说就是构建系统“记着”某个旧产物文件应该在DerivedData里,但实际上这个文件已经被删掉了,等它去执行清理操作时,自然就会抛出“找不到文件”的警告。
接下来具体说说可能的触发场景:
DerivedData被外部进程偷偷改动:
除了Xcode/AppCode自己的构建流程,系统里的其他工具(比如Spotlight索引、第三方磁盘清理软件、甚至iCloud同步)都可能悄悄访问或删除DerivedData里的文件。clean后第一次构建时所有文件都是全新生成的,没问题,但后续增量构建时,llbuild的缓存还记着那些文件的路径,可它们已经被外部工具删了,就会触发警告。旧版llbuild的缓存bug:
Xcode 9内置的llbuild版本刚好存在这个未修复的bug——在增量构建时,它没法及时同步已删除文件的状态,缓存里残留了一堆无效的文件路径。每次构建都要去尝试删除这些不存在的文件,自然就冒出上千条警告,这也是为什么你移除所有构建脚本后问题还存在的原因,因为根本不是脚本的锅。多构建工具混用的冲突:
如果你同时用Xcode和AppCode来回构建同一个项目,这两个工具对DerivedData的处理逻辑不完全一致。比如AppCode清理了某个.o文件,但Xcode的llbuild缓存还没更新,等Xcode构建时就会傻乎乎地去删已经不存在的文件,触发警告。
给你几个实际的排查和解决方向:
优先升级Xcode版本:
这个是最彻底的解决办法。Xcode 9之后的版本已经集成了修复该问题的llbuild更新,升级后缓存同步的逻辑会正常,自然就不会再出现这些无效警告了。排查外部干扰工具:
暂时关闭所有可能访问DerivedData的第三方工具(比如CleanMyMac这类清理软件、iCloud同步),甚至可以暂时关闭Spotlight的索引功能,观察后续构建是否还会出现警告,确认是不是外部进程在搞鬼。手动清理旧构建产物:
如果暂时没法升级Xcode,可以在项目的构建前步骤里加个小脚本,提前清理掉Intermediates目录里的旧文件,让llbuild的清理步骤找不到无效路径。脚本内容很简单:rm -rf "${BUILD_DIR%Build/*}"Build/Intermediates记得把这个脚本放在所有构建步骤的最前面,别影响正常的增量构建。
彻底重置构建缓存:
除了常规的Cmd+Shift+K清理构建文件夹,建议你手动找到DerivedData目录(可以在Xcode的Preferences -> Locations里打开),把整个目录删掉,然后重启Xcode/AppCode,让构建系统重新生成完整的缓存记录,把那些无效的路径彻底清掉。
内容的提问来源于stack exchange,提问作者Fogmeister

