go-bindataを使ってみた
2013-12-31 / Go
kawaken/ip2country を作ったものの、GeoIPのデータファイルを別で用意しないといけなくて、実際に使おうと思うとけっこうめんどくさかった。
MaxmindのIPデータベースのファイルはライセンス上、再配布可能になっているので、できれば一緒に提供した方が使うときに便利なのは間違いないが、ファイルが複数になるとこれも使いにくいし、できればバイナリが1つあるとそれで解決するというものにしたい。
golangはコンパイルしてバイナリを作るので、リソースファイル的に関連するファイルを含めることができると助かるんだけど、まだそこまでできないらしい。Issueにはけっこう前から上がっているけど、なかなか取り込まれる気配がない。(ここで自分で実装してパッチ送ったりできると良いんだろうけど、そこまでのスキルはない…)
IssueのURLは忘れてしまった。ググっても見つからない。
それで、別の手段として色々と探していて、jteeuwen/go-bindata というのを見つけたので使ってみた。
go-bindataの使い方
とりあえずはgo get
する。
go get github.com/jteeuwen/go-bindata
go get したら、GOPATHのbinの下に、go-bindata
という実行形式ファイルができるので、これを使う。
bin/go-bindata GeoIP.dat
上手くいくと、GeoIP.dat.go というファイルができていて、この中に[]byteを返す関数が作られている。元のファイルよりもGoのコードに変換されたコードの方がファイルサイズが大きくなる。
この関数を元のファイルに丸っとコピーしてできあがり。
ip2countryに関して言えば、go-libGeoIPのLoadがファイルを指定するようになっていたので、フォークして、Initializeという[]byteから初期化できるような関数を作ってみた。
気になったこと
go-bindataが作成する関数をmainに貼り付けたら、goのコンパイルがすごく時間がかかるようになった。本来であれば、別にした方が良いんだろうけど…。