Golangでビルド時にldflag
オプションをつけると、パッケージ内の変数に任意の情報を埋め込むことができるが、ちょっとハマったのでメモ。
以下のgo1.4
の記事だと書き方が現在のバージョンとは異なるみたいなので、2019/03現在のgo1.12
で書いてみたという位置づけです。
Go言語: ビルド時にバージョン情報を埋め込みたい
前提
go version go1.12.1 darwin/amd64
こんな感じの変数を用意。
main.go
package main
import (
"fmt"
)
var version string
var revision string
func main() {
fmt.Printf("version: %s-%s\n", version, revision)
}
よくある書き方
main packageのversionという変数に値を埋め込む
変数と値は=
でつなげる
go build -ldflags "-X main.version=v1.0.0"
複数の変数を埋め込む
go build -ldflags "-X main.version=v1.0.0 -X main.revision=$(git rev-parse --short HEAD)"
mainではないパッケージの変数に埋め込む
main.version
ではなく$GOPATH/src
からのパスを指定する。
パスなのでパッケージ名ではなくディレクトリ名を指定する。
go build -ldflags "-X github.com/irotoris/jobkickqd/cmd.version=v1.0.0"
こんな感じでgithub.com/spf13/cobra
使ったコマンドにビルド情報を埋め込みたかったんです。
go/src/github.com/irotoris/jobkickqd/cmd/version.go
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
var version string
var revision string
// version command shows version and build revision
var versionCmd = &cobra.Command{
Use: "version",
Short: "Show version and build revision.",
Long: `Show version and build revision.`,
Run: func(cmd *cobra.Command, args []string) {
fmt.Printf("version: %s-%s\n", version, revision)
},
}
func init() {
rootCmd.AddCommand(versionCmd)
}
埋め込む変数に空白を入れる
-X
の文字列を''
で囲ってあげる。そうしないとオプションのパースが失敗してエラーになる。
go build -ldflags "-X 'main.version=v1.0.0 rc'"