Go 项目生成版本号

参考

版本号的作用

版本信息管理,是项目开发中需要考虑的问题。尤其在各类开源软件中,重要的功能特性一定需要版本号绑定。通过版本号,用户才能知道该程序提供了哪些功能。

那么,如何为项目添加版本号呢?很多人应该都使用过硬编码方式,即将版本号直接写入源码或者配置文件,每次功能升级就修改版本号。这种方式,显然是可行的,但是也容易出错。一是发版时,容易忘记更新版本号,二是多个分支代码合并时,也可能搞混。

下文,给大家带来一个不一样的管理方案。

ldflags -X 变量传递

go 链接器 Linker 是组装二进制文件的工具,我们在执行 go build 命令时,可以通过 --ldflags 标志设定链接器参数,使用以下语句可查看链接器可选参数。

go build --ldflags="--help"

参数很多,但我们感兴趣的是 -X

$ go build --ldflags="--help"usage: link [options] main.o...  -X definition     add string value definition of the form importpath.name=value...

-X 参数,指定 importpath.name=value,用于修改变量值。其中 importpath 表示包导入路径,name 是程序中的变量名,value 代表我们想要设定的变量值。

下面,我们通过示例项目来具体感受一下。

$ mkdir versionDemo $ cd versionDemo/$ go mod init versiondemogo: creating new go.mod: module versiondemo$ touch main.go

在 main 函数中,我们打印 version 值。

package main import ( "fmt") var ( version = "0.0.1") func main() { fmt.Println("version: ", version)}

如果正常编译执行程序,将得到以下结果

$ go build -o main && ./mainversion:  0.0.1

此时,我们指定 --ldflags 的 -X 参数重新编译执行

$ go build -o main --ldflags="-X 'main.version=client-0.0.2'" && ./mainversion:  client-0.0.2

可以看到 version 参数值已经被改变。

添加 git 信息

开发中需要使用 git 工具,本文讨论的版本管理,也经常与 git tag 挂钩。那其实有更酷的操作:我们可以在构建期间,通过 git commit 信息自动填充版本号。

我们基于上文项目目录,添加 git commit 信息。

$ git init$ git add .$ git commit -m "initial commit"

通过以下命令,可拿到 git commit 的 hash 值

$ git rev-parse HEAD46dab0ddb6ba20445c2c1f047575e25d3aad1a27

该值较长,我们可以添加 --short 选项获取短 hash 值。

$ git rev-parse --short HEAD46dab0d

此时,通过指定 --ldflags 的 -X 参数,将 version 值替换成 git commit 的哈希值。这样,我们成功地将项目版本与 git 信息绑定在了一起。

$ go build -o main --ldflags="-X 'main.version=$(git rev-parse --short HEAD)'" && ./mainversion:  46dab0d

总结

本文介绍了一种如何通过 ldflags -X 变量传递的方式。使用这种方式我们可以在构建时轻松设定一些元信息,例如本文示例的程序版本信息。而这种构建的动作不应该手动去执行,而是放入到 CI/CD 流程中,让整个过程变得更加丝滑。

关于 ldflags 的用例或版本号管理方案,如果大家有更好的想法,欢迎留言交流。

在 Go 语言中,生成带文件版本号的发布版文件并不像在其他编程语言中那样常见,也不像 Windows 操作系统那样具有内置的机制。不过,您可以在您的 Go 项目中使用一些第三方工具来实现这一功能,下面是其中两个比较常用的工具: 1. goreleaser:这是一个用于打包和发布 Go 项目的工具。它可以自动生成版本号,并根据您的项目配置文件(例如 .goreleaser.yml)生成二进制文件、源代码和其他发布文件。您可以使用以下命令安装 goreleaser: ``` brew install goreleaser ``` 安装完成后,您可以在您的 Go 项目中使用该工具来打包和发布版本。例如,如果您要将您的项目版本号更新为 v1.2.3,并发布到 GitHub 上,您可以使用以下命令: ``` goreleaser release --rm-dist ``` 这将自动生成版本号,并在 GitHub 上发布您的 Go 项目生成的发布版文件包含了文件版本号等信息。 2. goversioninfo:这是一个 Go 语言编写的工具,可以为您的 Windows 程序生成带文件版本号的文件。您可以使用以下命令安装 goversioninfo: ``` go get github.com/josephspurrier/goversioninfo/cmd/goversioninfo ``` 安装完成后,您可以在您的 Go 项目中使用该工具来生成带文件版本号的文件。例如,如果您要将您的项目版本号更新为 v1.2.3,并生成一个带文件版本号的可执行文件 myapp.exe,您可以使用以下命令: ``` goversioninfo -o versioninfo.go go build -ldflags="-X main.version=v1.2.3" -o myapp.exe main.go versioninfo.go ``` 其中,goversioninfo 命令用于生成 versioninfo.go 文件,该文件包含了文件版本号等信息。go build 命令使用 -ldflags 参数来指定版本号信息。生成的发布版文件包含了文件版本号等信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值