如何手动填充.ninja_log,避免Ninja不必要的文件重构建?
解决Ninja移动文件后过度重构建的问题
核心思路
要让Ninja仅在真正有变更时触发构建,关键是生成包含正确文件状态记录的.ninja_log,让Ninja认可现有文件的有效性。
具体解决方案
快速修复:使用
ninja -t touch
直接运行ninja -t touch,这个命令会将所有目标文件的时间戳更新为当前时间,同时自动生成/更新.ninja_log,让Ninja判定这些文件都是最新构建完成的。注意:此操作会修改文件的实际时间戳,若需保留原始时间戳,慎用此方法。
不修改文件时间戳的修复方式
- 先手动创建空的
.ninja_log:touch .ninja_log - 运行
ninja -t restat,此时Ninja会遍历所有目标与依赖,校验文件状态后将正确的构建记录写入.ninja_log。
提示:
ninja -t restat仅在.ninja_log存在时生效,所以必须先创建空日志文件。- 先手动创建空的
关于类似
--dry-run且写入日志的命令
Ninja目前没有直接支持此类的命令,但可以通过组合操作实现近似效果:- 先用
ninja -n(dry-run模式)查看Ninja计划构建的文件列表 - 确认这些文件已存在且为最新状态后,使用上述
ninja -t touch或restat的方式生成正确日志。
- 先用
额外注意事项
- 调整
build.ninja后,务必检查其中的文件路径是否与实际文件位置匹配,路径错误会导致Ninja误判依赖缺失。 - 操作前建议备份
build.ninja与文件目录,避免误操作导致数据丢失。
内容的提问来源于stack exchange,提问作者Vi.
相关产品推荐
相关产品推荐

