GOでos.Open()
などを使って静的なファイルをロードすることは多い。
この場合、ビルドした実行ファイルと一緒に静的コンテンツを配る必要がある。
またgopherjsでjavascript化すると開くことができない。
バイナリ化してしてコードに含めると実行ファイルに含められるが、面倒なうえにサイズが非常に大きくなってしまう。
go-assets-builderを使うとどちらも解決したので、使用方法などメモ。
まずはビルダーを使わずにバイト化してみます。
1 2 3 4 5 6 7 8 9 10 11 |
func test(){ file,_ := os.Open("img/01.png") defer file.Close() buf,_ := ioutil.ReadAll(file) strout := "package main\nvar(\n" strout += fmt.Sprintf("ibyte = %#v",buf) strout += "\n)" file_o,_ := os.Create("media.go") defer file_o.Close() file_o.WriteString(strout) } |
何も考えずバイト配列にして変数に入れています。
普通に使えますが複数ファイルを対象にするのは面倒だし、容量が6倍ほどになりました。
そこでgo-assets-builderを使います。
1 2 3 4 5 6 7 8 |
//最新版のインストール go get -u github.com/jessevdk/go-assets-builder //media.goという名前でpackage mainのものを作成 go-assets-builder -output=media.go -p=main img/01.png //実行ファイルに含める go run main.go media.go |
複数ファイルの場合は末尾に追加していくだけです。
1 |
go-assets-builder -o=media.go -p=main img/01.png img/02.png |
メインのソース側ではfileのように扱うことが可能です。
1 |
file, err := Assets.Open("/img/01.png") |
単純にバイト化した場合の半分(元ファイルの3倍)の容量でした。
gopherjsで使うこともできたので軽いファイルを扱う時にはこれが一番良さそう。