1. harukasan

    No comment

    harukasan
Changes in body
Source | HTML | Preview
@@ -1,74 +1,74 @@
Golangのアプリケーションはビルドした状態で各サーバにデプロイするのが一般的だと思うが、どのバージョンがデプロイされているのか確認したくなる。ビルドする際にバージョン情報を埋め込めると良い。
## リンク時に変数を指定する
まずはバージョンを表示できるようにコードを追加しよう。`-version`オプションが指定されたらバージョン番号をプリントして出力するようにする。
-```go
+```go:main.go
package main
import (
"flag"
"fmt"
)
var version string
var show_version = flag.Bool("version", false, "show version")
func main() {
flag.Parse()
if *show_version {
fmt.Printf("version: %s\n", version)
return
}
// ... snip ...
}
```
後はビルド時に変数`version`に文字列を指定するだけである。goの[ld](http://golang.org/cmd/ld/)コマンドは`-X`オプションを使用することで、初期化していない変数の値を指定することが出来る。これを利用してビルド時にバージョン情報を含める。
```
go build -ldflags "-X main.version $(git describe)" main.go
```
`main.version`はmainパッケージのversion変数ということだ。ここでは`git describe`コマンドを使用した。
実行すればちゃんとバージョンが表示されるはずだ。
```sh
$ ./main -version
version: v1.1
```
## git describe
`git describe`コマンドを使用すると、直近のtagを元にしたバージョン番号を生成してくれる。
例えば、HEADに`v1.1`というタグが打たれていれば、実行結果は次のようになる。tagにコメントを付けていない場合は、`--tags`オプションをつけると全てのtagを探索対象にしてくれる。
```sh:
$ git describe
v1.1
```
また、HEADにタグが打たれていなければ、コミット数とハッシュを元に適切なバージョン名を生成する。
```sh:
$ git describe
v1.1-2-g012abc
```
このときのフォーマットは次のようになっている。
```sh
${直近のタグ}-${タグからのコミット回数}-g${ハッシュのprefix}
```
このように何となくどのコミットがHEADだったときにbuildしたのか把握できて便利だ。
## ライセンス
本記事は下記記事を再編集しており、[CC BY-SA 3.0](http://creativecommons.org/licenses/by-sa/3.0/)でライセンスされる。
- [version control - Go: how to add git revision to binaries built? - Stack Overflow](http://stackoverflow.com/questions/15711780/go-how-to-add-git-revision-to-binaries-built)