uokadaの見逃し三振は嫌いです

ここで述べられていることは私の個人的な意見に基づくものであり、私が所属する組織には一切の関係はありません。

go build時に変数を埋め込む方法

社内で使うGO製ツールにバージョンを埋め込みたくなったのでちょっと動作確認してみた。

ldflagsオプションから変数を渡すことが出来るとのことだったので適当なコードを書いてみた。

% go build  -ldflags="-X main.version 1.0"
% ./build -h
test tool
Version: 1.0

変数と値の間に "=" おいてるとちゃんとバージョンが埋め込まれない模様。 最初のビルド時にしばらくハマった。

% go build  -ldflags="-X main.version=1.0"

参考

package main

import (
    "flag"
    "fmt"
)

var (
    version string
)

func init() {
    flag.Usage = usage
    flag.Parse()
}

func usage() {
    fmt.Println("test tool ")
    fmt.Println("Version:", version)
}

func main() {
    fmt.Println("Hey World!")
}

2016-02-20 追記

go1.5ぐらいから "=" を挟まない書き方をすると警告が出るようになった。
下は現在のgitのリビジョンをコミットに含める例。

% go build -o sample -ldflags="-X main.version `git rev-parse --verify HEAD`"
link: warning: option -X main.version 8abced796a6ceb555c8ebc14c1884798307e4b73 may not work in future releases; \
 use -X main.version=8abced796a6ceb555c8ebc14c1884798307e4b73 <= ホントは1
% go build -o sample -ldflags="-X main.version=`git rev-parse --verify HEAD`"
% ./sample  -h
test tool
Version: 8abced796a6ceb555c8ebc14c1884798307e4b73