很多时候对于go打包后的二进制文件,我们是无法知道这个二进制是什么当前什么版本、什么时候打包的,而很多软件的命令行都会有一个 -version 的选项来打印出当前程序的版本号,当然你可以直接在程序里面写死这个版本号,但是还有更加优雅的解决方式。

实现

其实很简单,只需要在 build 的时候通过 -X 参数去指定变量值就可以了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import "fmt"

var (
Tag = "v0.0.0"
CommitID = ""
Branch = ""
DATE = ""
)

func main() {
fmt.Println("tag:", Tag, "branch:", Branch, "commitID:", CommitID, "DATE:", DATE)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/sh

# 获取当前commit号
CommitID=$(git rev-parse HEAD)

# 获取当前分支名称
Branch=$(git rev-parse --abbrev-ref HEAD)

# 获取最近的tag
Tag=$(git describe --abbrev=0 --tags)

# 打包时间
DATE=$(date +'%Y-%m-%dT%H:%M:%m+08:00')

go build -ldflags "-X 'main.Tag=$Tag' -X 'main.Branch=$Branch' -X 'main.CommitID=$CommitID' -X 'main.DATE=$DATE'"

其中需要注意的是,用单引号的原因是防止变量中带有空格,main标识包,你可以替换成程序中对应的包就可以。

总结

这样,当我们在实际生产环境使用的时候,就可以通过这些打包时携带的信息来分析这个包是什么时候的,是否为最新版本等。