如何让go generate执行时自动跳过未变更的文件/包
实现
go generate增量跳过未变更文件生成的方案 原生go generate ./...没有内置基于文件变更的增量跳过能力,不需要修改Go工具链,用以下两种轻量方案即可满足同目录下仅重跑变更文件对应生成任务的需求,不需要调整现有目录结构:
- 方案1:在生成指令层加修改时间判断
这是成本最低的实现方式,不需要额外引入工具。核心逻辑是:执行实际生成命令前,先判断源文件修改时间是否晚于对应生成产物的修改时间,或产物不存在时才真正触发生成,否则直接跳过。
如果是类Unix环境,可以直接在go:generate注释中嵌套shell判断,示例写法:
Windows环境可以替换为等价的PowerShell判断逻辑。如果你使用的是自研的生成工具,直接把上述mtime(文件修改时间)比对逻辑内置到工具启动流程中即可,连外层shell包装都不需要,工具检测到无变更时直接正常退出,不会中断// 对应example1.go的生成指令 //go:generate sh -c "if [ example1.go -nt generated_example1.go ]; then 你的生成命令 -output generated_example1.go; fi"go generate的整体执行流程。 - 方案2:使用支持增量缓存的generate包装工具
如果不想给每条生成指令单独写判断逻辑,可以使用轻量的go generate包装工具替代原生go generate命令。这类工具会自动扫描所有go:generate指令,记录每条指令关联的输入文件哈希值,下次执行时自动比对哈希,仅当关联输入文件发生变更时才重跑对应生成指令。选型时注意选择支持单条指令自定义依赖文件的工具,避免工具默认将整个目录下所有文件作为依赖,导致改单个文件触发全目录重跑的问题。
不建议通过拆分子目录的方式实现该需求,同目录下存在多个关联生成指令时,拆分目录会破坏代码的包结构,反而增加维护成本。
内容的提问来源于stack exchange,提问作者minion
相关产品推荐
相关产品推荐

