查找当前主模块的伪版本

Find the Pseudo-version of the current, main module

我有一个 Go codegen 工具,在将它构建为二进制文件时,我想在构建时使用 Go 工具为其主模块注入它自己的当前 Pseudo-version

我知道对于依赖项,我可以使用 go list -m allgo list -m -f '{{ .Version }}' $MODULE 找到它们的伪版本。主模块的版本列为空。

我知道我大概可以计算出当前的伪版本:

git describe --tags `git rev-list --tags --max-count=1`

和:

TZ=UTC git --no-pager show \
   --quiet \
   --abbrev=12 \
   --date='format-local:%Y%m%d%H%M%S' \
   --format="%cd-%h"

要获得合理的近似值,例如:v0.3.0-20210907161133-495c072cb418

获得伪版本后,我打算像这样在构建时注入它:

go build -ldflags="-X generate.version v0.3.0-20210907161133-495c072cb418" -o mytool ./main.go

但是,建议是直接使用 Go 工具来获取当前的伪版本,而不是我在餐巾纸上弄出来的一些骇人听闻的 bash 东西。关于如何执行此操作有什么建议吗?

pseudo-versions 的问题在于它只是 VCS 中特定修订版的编码(不仅仅是 Git)。

而且,它通常在模块没有 semver 标签时使用,或者当您只需要一个特定的修订版时,它可以是分支名称。

Pseudo-versions may refer to revisions for which no semantic version tags are available. They may be used to test commits before creating version tags, for example, on a development branch.

因此,要获得伪版本,首先您必须参考 修订版。现在,哪个版本最准确地描述了您的项目,这将取决于您。 master 分支的提示可能足够好,因此:

go list -f '{{.Version}}' -m example.com/mymodule@master

注意语法 module@version,它允许您选择特定的修订版,从而获得相应的伪版本。