Golangのバイナリに静的ファイルを組み込む

markdownをgithubスタイルのHTMLに変換するmark2hというものを作成したが、 使用するCSSやHTMLのテンプレートはバイナリに組み込まないとパスが変わった時に反映されなくなってしまう。 今回は、go-bindataを使って静的ファイルをGoのバイナリに組み込んでみる。

go-bindataを使う

  1. go-bindataのinstall
$ go get -u github.com/jteeuwen/go-bindata/...
  1. 静的ファイルを格納するディレクトリを作る(名前は適当なもの)
$ mkdir assets
  1. go-bindataを実行する
$ go-bindata -o assets.go assets
  1. template読み込み部分を置き換える
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/main.go b/main.go
index 1b2ec1a..8d5cfdb 100644
--- a/main.go
+++ b/main.go
@@ -55,13 +55,13 @@ func main(){
                os.Exit(0)
        }

-       tpl, err := ioutil.ReadFile("markdown.html")
+       tpl, err := Asset(templatePath)
        if err != nil {
                fmt.Println(err)
                os.Exit(1)
        }

-       t := template.Must(template.New("markdown").Parse(string(tpl)))
+       t := template.Must(template.New(templatePath).Parse(string(tpl)))
        if err = t.Execute(os.Stdout, template.HTML(string(html))); err != nil {
                fmt.Println(err)
                os.Exit(1)

ReadFile していた部分を Asset に置き換えるだけ

  1. 通常通りバイナリを生成する
$ go build

以上でパスを変えて実行してもHTMLのテンプレートが読み込まれるようになった。 もちろん、バイナリサイズは増えるので用途に応じてつかうのが良い。

Debugする

静的ファイルを変更するたびにgo-bindataを実行するのは大変だが、 これを回避するための-debugオプションが存在している。

go-bindata -debug -o assets.go assets

このフラグをつけると、インタフェースは保ったまま挙動だけ 実行時に静的ファイルが読み込まれるよう変更される。

comments powered by Disqus