Xcode自定义Build Phase:配置输入输出文件后脚本未执行
自定义Build Phase脚本Input/Output配置问题解决
先明确Input/Output Files的实际作用
- Input Files:Xcode的触发开关——只要列表里的任意文件内容或修改时间更新,Xcode就会判定需要执行脚本。
- Output Files:Xcode的产物标记——告诉Xcode这些文件是脚本生成/修改的结果,Xcode会对比Input文件和Output文件的时间戳,来决定是否重新执行脚本(比如Output文件被删除、损坏,或者Input比Output新时,都会触发)。
你的问题核心:配置遗漏点&修正步骤
你遇到的修改FileA.swift后脚本不执行,大概率是路径写法错误或脚本位置不对,按以下步骤修正:
用Xcode环境变量指定文件路径
直接写FileA.swift或绝对路径是坑——Xcode的Build Phase工作目录不是项目根目录,必须用环境变量定位文件:- Input Files里添加:
${SRCROOT}/FileA.swift - Output Files里添加:
${SRCROOT}/FileB.swift${SRCROOT}是Xcode内置变量,指向你的项目根目录,不管项目放哪都能正确找到文件。
- Input Files里添加:
调整脚本Phase的位置
把你的Run Script Phase拖到Compile Sources的上方!如果放在Compile之后:- 就算脚本执行了,也赶不上FileB.swift的编译,等于白改;
- Xcode会认为编译阶段已完成,不会触发脚本执行。
清理Xcode缓存
有时候旧缓存会导致Xcode判断异常,执行Cmd+Shift+K清理Build文件夹,再重新Build试试。验证脚本本身的路径逻辑
确保脚本里读取FileA和写入FileB的路径,和你在Input/Output里配置的一致——如果脚本用了相对路径,要注意脚本的执行工作目录是Xcode的Build目录,最好也改成用${SRCROOT}来定位文件,比如脚本里写:FILE_A="${SRCROOT}/FileA.swift" FILE_B="${SRCROOT}/FileB.swift" # 你的解析和更新逻辑...
额外注意点
Xcode判断是否执行脚本的逻辑是:
对比所有Input文件的修改时间 ≥ Output文件的修改时间 → 执行脚本;否则跳过。
如果Input/Output的路径配置错误,Xcode找不到对应文件,就会直接跳过脚本执行。
内容的提问来源于stack exchange,提问作者Vladimir Amiorkov
相关产品推荐
相关产品推荐

