在 Go 下构建带有 git 提交编号的程序

2019-02-10 12:42 #旧文章

提示

本文给出的脚本是 Linux 下的,其他平台可以根据原理推导。Go 版本号 1.11.5

第一步我们需要在文件中提供一个变量(常量我没试过)来存储提交编号。

package main
var Version = "Unknown"
func main() {
...
}

第二步写一个编译脚本

Terminal window
go build -ldflags "-X main.Version=`git rev-parse HEAD`" src/app.go

这就是 Go 的编译命令,其中的 -ldflags "-X main.Version=git rev-parse HEAD" 表示将 main.Version 这个变量的值设置为等号后面的东西,在 Linux 命令行下,由 ```` 包裹的字符串会被执行,执行的标准输出将插入到原始命令中,如本例:

Terminal window
go build -ldflags "-X main.Version=`git rev-parse HEAD`" src/app.go

Shell 发现有由 ```` 包裹的字符串,将其提出并执行,得到程序的标准输出为

077d7434cb15687fbae2244c34204aa54768ae50

接着 Shell 将这一串输出放回到原命令中,得到如下结果

Terminal window
go build -ldflags "-X main.Version=077d7434cb15687fbae2244c34204aa54768ae50" src/app.go

于是命令变成了这样,执行编译后编译器就会把 main.Version 设置为 077d7434cb15687fbae2244c34204aa54768ae50,这个变量在程序中你想怎么用就怎么用。