這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
我們經常會在一些程式的輸出中看到程式版本、編譯時間、Git的commit id等資訊,比如docker
ming@vultr:~$ docker versionClient: Version: 1.12.5 API version: 1.24 Go version: go1.6.4 Git commit: 7392c3b Built: Fri Dec 16 02:42:17 2016 OS/Arch: linux/amd64...
我們可以提供一個設定檔version.conf
,程式運行時從version.conf
取得這些資訊進行顯示。但是在部署程式時,除了二進位檔案還需要額外的設定檔,不是很方便。
或者將這些資訊寫入代碼中,這樣不需要額外的version.conf
,但要在每次編譯時間修改代碼檔案,也夠麻煩的了。
有一種更好的辦法是在編譯時間使用參數-ldflags -X importpath.name=value,官方解釋如下
-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.
以下面代碼說明
package mainimport "fmt"var ( VERSION string BUILD_TIME string GO_VERSION string)func main() { fmt.Printf("%s\n%s\n%s\n", VERSION, BUILD_TIME, GO_VERSION)}
用如下命令編譯,注意因為date
和go version
的輸出有空格,所以main.BUILD_TIME
和main.GO_VERSION
必須使用引號括起來
go build -ldflags "-X main.VERSION=1.0.0 -X 'main.BUILD_TIME=`date`' -X 'main.GO_VERSION=`go version`'"
編譯成功後運行程式,結果如下
ming@ubuntu:~/go_workspace/src/test$ ./test 1.0.0Sun Feb 12 00:13:27 CST 2017go version go1.7.5 linux/amd64