golang編譯時給包內變數賦值,實現列印版本號及commit
很多命令列程式都可以通過version引數輸出版本資訊,commit,作業系統等資訊。下面介紹一種方法實現golang編譯的命令列程式列印版本號。
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 Server: Docker Engine - Community Engine: Version:18.09.2 API version:1.39 (minimum version 1.12) Go version:go1.10.6 Git commit:6247962 Built:Sun Feb 10 04:13:06 2019 OS/Arch:linux/amd64 Experimental:false
實現方式是利用go build的一個引數-ldflags
。輸入go help build,可以看到一個配置項:
-ldflags 'flag list' arguments to pass on each go tool link invocation.
這個引數是用來設定go link(靜態連結)的一些引數,具體有哪些引數可以通過go tool link --help
檢視。
其中-X
引數可以在編譯時給包內的變數賦值,然後我們利用flag包設定version
引數就能實現列印版本號了。
main.go:
package main import ( "flag" "log" "os" ) var ( Versionstring Branchstring Commitstring BuildTime string lowercase string // 小寫也可以 ) func main() { versionFlag := flag.Bool("version", false, "print the version") flag.Parse() if *versionFlag { log.Printf("Version: %s\n", Version) log.Printf("Branch: %s\n", Branch) log.Printf("Commit: %s\n", Commit) log.Printf("BuildTime: %s\n", BuildTime) log.Printf("lowercase: %s\n", lowercase) os.Exit(0) } log.Println("run main.go") }
打包指令碼:
#!/usr/bin/env bash prog=xxx version=1.1.0 lowercase=ok # 交叉編譯 # CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "\ -X main.Version=$version \ -X main.Branch=`git rev-parse --abbrev-ref HEAD` \ -X main.Commit=`git rev-parse HEAD` \ -X main.BuildTime=`date -u '+%Y-%m-%d_%H:%M:%S'` \ -X main.lowercase=$lowercase \ " -v -o $prog main.go
最終效果:
$ ./xxx -version 2019/04/11 00:59:08 Version: 1.1.0 2019/04/11 00:59:08 Branch: master 2019/04/11 00:59:08 Commit: 29921d9df18543693321e2109ea36462dbb346d3 2019/04/11 00:59:08 BuildTime: 2019-04-10_16:59:07 2019/04/11 00:59:08 lowercase: ok