我们都知道在一些 Golang 写的程序中,默认会有
version
或-v
相关的参数来输出软件版本信息,这些版本信息里可能包含软件版本,git 中的 commit 记录,构建时间、构建环境等信息,那么这些信息都是如何在 Golang 程序中进行维护和管理的呢?请看👇.
示例
比如我们常用的 Golang 开发的程序是这样输出版本相关信息的:
# k8s的客户端程序版本
$ kubectl version -o json --client
{
"clientVersion": {
"major": "1",
"minor": "10",
"gitVersion": "v1.10.11",
"gitCommit": "637c7e288581ee40ab4ca210618a89a555b6e7e9",
"gitTreeState": "clean",
"buildDate": "2018-11-26T14:38:32Z",
"goVersion": "go1.9.3",
"compiler": "gc",
"platform": "darwin/amd64"
}
}
# docker的客户端程序版本
$ docker version
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:39 2019
OS/Arch: darwin/amd64
Experimental: false
# minio的客户端程序版本
$ minio --version
minio version RELEASE.2020-04-10T03-34-42Z
从上面的版本输出记录中我们其实可以看出,版本信息中不仅记录了基本的构建环境和版本信息,同时还记录了 commitId,所以这些信息应该是在 build 时动态传入到程序中的,大概猜测一下应该就是提前在程序的 version 相关代码中预留好版本相关的变量,然后在构建的时候对变量进行赋值,以此来实现变量的动态注入。
小试牛刀
在大概猜测后,查看到相关文档中有说明可以在构建时使用参数 -ldflags -X importpath.name=value
来动态注入变量。在官方稳定 link 中有详细说明:
-X importpath.name=value
Set the