2017年3月14日火曜日

golangで静的ファイルも含めたシングルバイナリを作りたいのでgo-bindataを使ってみた的なお話

  • このエントリーをはてなブックマークに追加

golangはビルドするとバイナリを一つだけ出してくれるので、諸々配布とかが簡単だから便利なわけで。
ただwebアプリとかAPIサーバを作るとかそういうときは大体設定ファイルがtomlとか別の静的ファイルで用意されてるわけで。
その場合設定ファイルとか静的ファイルとかそういったものはバイナリには含まれない。
そうするといちいちそれらもアップロードしないといけないとかでなんというかかんというか。

ということで今回はそれを解決するためにgo-bindataを使ってみました的なお話をば。

jteeuwen/go-bindata

まずはgodocでも見てもらえれば的な。
とりあえずは下記のような感じでやっておいた。

■ディレクトリ

$ tree
.
├── app
│   └── shared
│       └── config
│           ├── bindata.go
│           └── config.go
├── config
│   ├── config_development.toml
│   └── config_production.toml
└── main.go

■go-bindataのインストール

# install bindata
$ go get -u github.com/jteeuwen/go-bindata/...

■go-bindataでconfig/の中身をバイナリ化

$ go-bindata \
  -prefix "$GOPATH/src/hogehoge" \
  -o $GOPATH/src/hogehoge/app/shared/config/bindata.go \
  -pkg config \
  $GOPATH/src/hogehoge/config/

ってな感じ。
go-bindataをするときにオプションは諸々つけれる。
・-prefixはファイルのprefix除去
・-oはどこにファイルを吐き出すか
・-pkgは吐き出されたファイルのpackage名

自分はconfigファイルを吐き出したかったので、package名をconfigにして、app/shared/configの中に入れた。

という感じでやってあげて、最終的にgo installしてあげればシングルバイナリになるっていう。
どうしてもシングルバイナリでやらないといけないわけじゃないけど。
ちなみに吐き出されたバイナリ(toml)から諸々抜き出すには下記のような感じ。

data, err := Asset("config/config_" + os.Getenv("APP_ENV") + ".toml")
if err != nil {
  panic(err)
}

meta, err := toml.Decode(string(data), &config)
if err != nil {
  panic(err)
}

fmt.Println(meta)

どうしてもシングルバイナリでやりたいならばgo-bindataを使えばいいんじゃないか的なみたいな。

Adsense