【问题标题】:How to run go generate only for changed templates?如何只为更改的模板运行 go generate?
【发布时间】:2019-09-02 12:50:01
【问题描述】:

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

【问题讨论】:

  • 你有什么样的模板?又会生成什么样的代码?
  • 这是泛型的一种解决方法:正在生成的代码是有效且可编译的 go,模板是包含一些变量的 go 代码,这些变量将被多个结构名称替换

标签: go generated-code


【解决方案1】:

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

go generate ./...

在子文件夹中递归。

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

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

【讨论】:

  • 感谢第一个提示!关于检查时间戳或版本,是的,我知道这种方法会起作用,但是我可以使用任何开关或任何现成的工具吗?还是我自己写?
  • @sazart 我不知道。
猜你喜欢
  • 2013-01-04
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
相关资源
最近更新 更多