go - 如何仅针对更改的模板运行 gogenerate?

标签 go generated-code

我们在存储库中使用一些代码模板,并依靠 go:generate 从这些模板生成所有需要的代码。
由于有多个模板,并且我们从每个模板生成多个实际代码,因此生成代码的一致性已成为一个问题:我们需要一个命令来运行并确保所有生成的代码与其相应的模板都是最新的。为此,我们有一个简单的 bash 命令来查找其中包含 go:generate 的所有文件,并在其目录中运行 gogenerate
问题是这种方法真的很慢:大多数模板都没有改变,所以不需要再次生成它们的代码。
有没有办法告诉 gogenerate 仅在模板比文件新时运行?或者说除了这个还有其他更好的方法吗?
非常感谢。

最佳答案

首先,您不需要在文件中查找 go:generate 的 bash 脚本,go 工具本身可以为您做到这一点。只需使用

go generate ./...

在子文件夹中递归。

接下来,当代码生成运行时,我会将模板文件的上次修改时间戳存储在生成的代码中,无论是在注释中还是在 const/var 中。由 gogenerate 运行的应用程序可以首先检查模板的上次修改时间是否比代码中存储的时间更新,如果是则继续。

这个文件的最后修改时间应该足够了。但是,如果由于某种原因您不能依赖它,模板可能有一个“版本”,当模板更改时,该版本应该增加。并让生成器将此版本“传输”到最终代码中,这可用于检查模板是否比从其生成的代码新。

关于go - 如何仅针对更改的模板运行 gogenerate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57757242/

相关文章:

go - go lang 中类似 slice 移位的函数

go - range所返回的迭代值的数据类型是什么?

java - 如何在 Android Studio 的 Java 库模块中使用 Dagger?

php - 在 Enterprise Architect 中为 PHP 生成 getters 和 setters

java - Netbeans 生成的代码

go - 如何在 Gin 中对路线进行分组?

go - 克服 Go 中不允许的导入周期

go - 如何在 go 中对 gRPC 服务进行单元测试

php - 是否存在用于解析 ASN.1 或基于它生成 PHP 代码的 PHP 库?

java - 如何修复 NetBeans 生成的代码上的 'Exception in thread "AWT-EventQueue- 0"java.lang.NullPointerException'?