如何使用Go原生工具获取主模块Pseudo-version并在构建时注入
可行实现方案
方案1:Go 1.18+ 原生自动嵌入(最推荐)
Go 1.18及以上版本的工具链会自动在构建时将版本、提交哈希、构建时间等信息嵌入二进制,完全不需要手动编写脚本生成版本、也不需要手动配置ldflags注入,直接在代码中读取即可:
package main import ( "fmt" "runtime/debug" ) var version string func main() { // 优先用ldflags注入的版本,没有的话用内置构建信息 if version == "" { info, ok := debug.ReadBuildInfo() if ok { version = info.Main.Version // 还可以按需读取更多构建信息 for _, setting := range info.Settings { switch setting.Key { case "vcs.revision": // 读取commit哈希 case "vcs.time": // 读取commit时间 case "vcs.modified": // 读取是否存在未提交的修改 } } } } fmt.Println("工具版本:", version) }
该方案生成的版本完全符合Go官方伪版本规范:如果当前HEAD对应tag,版本直接为tag号;如果是tag之后的提交,会自动生成vX.Y.Z-N-commit哈希格式的标准伪版本,不会出现手动拼接版本不符合规范的问题。
方案2:构建前用Go原生工具获取伪版本
如果你需要在构建前拿到伪版本用于其他逻辑,直接执行以下命令即可生成标准伪版本,不需要手动拼接git命令输出:
# 将github.com/your/module替换为你的主模块路径 go list -m -f '{{.Version}}' github.com/your/module@$(git rev-parse HEAD)
拿到输出的版本后,再按你原来的ldflags方式注入即可。
方案3:兼容Go 1.18以下版本
如果需要使用低于1.18的Go版本,可使用官方mod工具生成伪版本:
- 安装官方mod命令工具:
go install golang.org/x/mod/cmd/gomod@latest - 执行命令生成标准伪版本:
gomod version -m . - 后续同样通过
ldflags注入即可。
注意:自行通过git命令拼接的伪版本大概率不符合Go官方规范,会缺失tag到当前提交的次数字段,导致后续版本比较逻辑出错,不推荐使用。
内容的提问来源于stack exchange,提问作者SteveCoffman
相关产品推荐
相关产品推荐

