如何在Go項目中輸出版本信息?


我們經常在使用CLI工具的時候,都會有這樣的參數輸出:

~ 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 ~

可以打印出構建時對應的版本信息,比如 Version,Go Version,Git Commit等,這個是如何實現的呢?

實現

主要是通過ldflags參數來實現在構建的時候對變量進行賦值。

比如下面一段代碼:

package main import ( "flag" "fmt" "os" ) //需要賦值的變量 var version = "" //通過flag包設置-version參數 var printVersion bool func init() { flag.BoolVar(&printVersion, "version", false, "print program build version") flag.Parse() } func main() { if printVersion { println(version) os.Exit(0) } fmt.Printf("example for print version") }

構建命令:

go build -ldflags "-X main.version=v0.1" -o example

程序輸出:

➜ ./example
version=v0.1

參數說明

1、-ldflags build命令中用於調用接鏈接器的參數

-ldflags '[pattern=]arg list' arguments to pass on each go tool link invocation.

2、-X 鏈接器參數,主要用於設置變量

-X importpath.name=value Set the value of the string variable in importpath named name to value. Note that before Go 1.5 this option took two separate arguments. Now it takes one argument split on the first = sign.

一個完整的例子

這里將version包單獨做了一個包存放,只需要引入即可:

package main import ( "flag" "github.com/go-demo/version" ) //通過flag包設置-version參數 var printVersion bool func init() { flag.BoolVar(&printVersion, "version", false, "print program build version") flag.Parse() } func main() { if printVersion { version.PrintVersion() } }

構建的shell如下(也可以放在Makefile中):

#!/bin/sh version="v0.1" path="github.com/go-demo/version" flags="-X $path.Version=$version -X '$path.GoVersion=$(go version)' -X '$path.BuildTime=`date +"%Y-%m-%d %H:%m:%S"`' -X $path.GitCommit=`git rev-parse HEAD`" go build -ldflags "$flags" -o example example-version.go

TIPS: 如果值內容中含有空格,可以用單引號

最終版本輸出:

sh build.sh ➜ ./example -version Version: v0.1 Go Version: go version go1.13.1 darwin/amd64 Git Commit: a775ecd27c5e78437b605c438905e9cc888fbc1c Build Time: 2020-01-09 19:01:51

完整代碼:https://github.com/go-demo/ve...

本文在公眾號"學點程序"首發 學點程序


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM