找到当前主模块的伪版本。

huangapple go评论82阅读模式
英文:

Find the Pseudo-version of the current, main module

问题

我有一个 Go 代码生成工具,在构建二进制文件时,我想要在构建时使用 Go 工具将其主模块的当前伪版本注入进去。

我知道对于依赖项,我可以使用 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 工具获取当前的伪版本,而不是像我在餐巾纸上设计的一些 hacky bash 脚本。有关如何做到这一点的建议吗?

英文:

I have a Go codegen tool and while building it as a binary I want to inject it's own current Pseudo-version for it's main module at build time using Go the tools.

I know that for dependencies, I can find their pseudo-version using go list -m all or go list -m -f '{{ .Version }}' $MODULE. The version for the main module is listed as empty.

I know that I can probably calculate the current pseudo version with:

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

and:

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

To get a reasonable approximation like: v0.3.0-20210907161133-495c072cb418

After I have the Pseudo-version, I intend to inject it at build time like this:

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

However, the recommendation is to use a Go tool directly to get the current Pseudo-version rather than some hacky bash thing I worked out on a napkin. Any suggestions as to how to do this?

答案1

得分: 4

关于伪版本的事情是,它只是用于表示版本控制系统(不仅限于Git)中的特定修订版本的编码。

通常情况下,当一个模块没有语义化版本标签,或者你只需要一个特定的修订版本(可以是分支名称)时,会使用伪版本。

伪版本可以指代没有语义化版本标签的修订版本。例如,在开发分支上创建版本标签之前,可以使用伪版本来测试提交。

因此,要使用伪版本,首先必须引用一个修订版本。现在,哪个修订版本最准确地描述了你的项目,这取决于你自己。master分支的最新提交可能已经足够好了,因此可以使用以下命令:

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

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

英文:

The thing with pseudo-versions is that it's just an encoding for a particular revision in a VCS (not just Git).

And, it is typically used when a module has no semver tag, or when you require just that, a particular revision, which can be a branch name.

> 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.

So to have a pseudo-version, to begin with you must refer to a revision. Now, which one is the revision that most accurately describes your project, it will be up to you. The tip of the master branch might good enough, therefore:

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

Notice the syntax module@version, which allows you to choose a specific revision, hence, get the corresponding pseudo-version.

huangapple
  • 本文由 发表于 2021年10月3日 02:13:48
  • 转载请务必保留本文链接:https://go.coder-hub.com/69419055.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定