😎

GoでGitのタグ情報を取得してバージョン情報に利用する

2024/12/01に公開

CLIツールを作るのにGoを用いている方は多いと思います。
さて、CLIツールにはバージョン情報を取得できるコマンドを乗せたいですよね。
例えば...

$ hoge -v
hoge version v1.0.0

のようなものですね。
そして同時に、開発したツールを公開する場合にはGitHubリポジトリを作成して以下のような形でインストールさせるのがスタンダードだと思います。

go install github.com/hoge/fuga@latest

ここで latest としていますが、バージョン管理にはGitのタグが使われています。しかし、Gitのタグを打ち、同時にソースコード内にバージョン情報を直接埋め込むのは二度手間でミスも発生しやすいです。

そこで runtime/debug パッケージの出番です。cobra を使った例を以下に示します。

package cmd

import (
	"runtime/debug"
	"github.com/spf13/cobra"
)

var rootCmd = &cobra.Command{
	Use:  "fuga",
	RunE: run,
}

func init() {
	bi, ok := debug.ReadBuildInfo()
	if ok {
		rootCmd.Version = bi.Main.Version
	}
}

この状態でローカル実行すると以下のようになります。

$ go run . -v
fuga version (devel)

いや devel ってなんだよとなるかと思いますが、これをGitHubリポジトリに上げ、Gitタグを打ち、go install すると正しい情報が出力されるようになります。つまり、以下のような形です。

$ git commit -m "example commit"
$ git push origin main
$ git tag v1.0.0
$ git push origin v1.0.0
$ go install github.com/hoge/fuga@latest
$ fuga -v
fuga version v1.0.0

バージョン情報をソースコードに埋め込まずとも正しく出力できるようになりましたね!
これでツールの配布がだいぶ楽になるかと思います。ぜひお試しください。今回は以上です。

Discussion