在工作中,经常需要查看一些应用程序的版本,使用-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
编译时,将有用的变量信息注入到应用程序中,可以设置版本、环境、各种标记等信息,而避免直接写死代码。