golang在編譯時用ldflags設置變量的值

轉載請註明出處,原文連接http://tailnode.tk/2017/01/go...node

咱們常常會在一些程序的輸出中看到程序版本、編譯時間、Git的commit id等信息,好比dockerlinux

ming@vultr:~$ docker version
Client:
 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,官方解釋以下golang

-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.docker

如下面代碼說明ubuntu

package main

import "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)
}

用以下命令編譯,注意由於datego version的輸出有空格,因此main.BUILD_TIMEmain.GO_VERSION必須使用引號括起來ui

go build -ldflags "-X main.VERSION=1.0.0 -X 'main.BUILD_TIME=`date`' -X 'main.GO_VERSION=`go version`'"

編譯成功後運行程序,結果以下this

ming@ubuntu:~/go_workspace/src/test$ ./test 
1.0.0
Sun Feb 12 00:13:27 CST 2017
go version go1.7.5 linux/amd64
相關文章
相關標籤/搜索