17
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Golangでビルド時にバージョン情報を埋め込む(2019.03)

Last updated at Posted at 2019-03-31

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'"
17
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?