英文:
Find the Pseudo-version of the current, main module
问题
我有一个 Go 代码生成工具,在构建二进制文件时,我想要在构建时使用 Go 工具将其主模块的当前伪版本注入进去。
我知道对于依赖项,我可以使用 go list -m all
或 go 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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论