在工作中,经常需要查看一些应用程序的版本,使用-v、--vserion等参数查看一个应用的版本,比如:
# node -v
v16.13.1
# go version
go version
go version go1.12.9 linux/amd64
那通过go build构成后生成的可执行文件,如果获取它的版本呢?
你是否会想到,直接在代码中写死版本?当然可以,但是太麻烦了,发布版本前需要在代码中修改版本。
一般在发布应用程序时,都需要先go build,那么可以通过-ldflags参数来注入版本到应用程序中。
package main
import (
"fmt"
"github.com/spf13/pflag"
)
var (
// version 定义版本变量
version = "v0.0.0"
// pVersion 接收命令行参数v
pVersion = pflag.BoolP("version", "v", false, "show version info.")
)
func init() {
pflag.Parse()
if *pVersion {
fmt.Println(version)
}
}
func main() {}
使用go build编译时,加上-ldflags -X参数,将变量注入到main.verison变量中,-ldflags后面的-X就是指将后面的变量(key=version)注入到程序中,变量的key需要指定完整包名,main.version就是指main包下的version变量。
go build -ldflags="-X main.version=v1.0.0"
然后,使用./main -v就可以查看版本:
# ./main -v
v1.0.0
科学的使用-ldflags,可以在go build编译时,将有用的变量信息注入到应用程序中,可以设置版本、环境、各种标记等信息,而避免直接写死代码。