読者です 読者をやめる 読者になる 読者になる

絶品ゆどうふのタレ

ふと気づいたことを綴るだけのメモ

Goで使ってみたライブラリとツールの感想をそこはかとなく書くよ

会社の方でRDS TestRunnerというツールをGoで実装したわけですが、今回の実装にあたってGoの色々なライブラリ/ツールを見て回った印象として、まだまだ群雄割拠状態だなーという感じでした。

これからスタンダードが決まっていくのでしょうが、今後も考えて各ライブラリ等を利用した感想を共有しておくのは有益そうなので、書き残しておくことにします。

ちなみに、今回はかなりの率でHashiCorpのmitchellhさん作のライブラリやツールを利用していますw なので、ほぼこの方の紹介になってますね。。。

コードもterraformなどの実装をかなり参考にさせていただきました。 やはりGoでのプロダクト経験が豊富な人の実装は、色々参考になりますね(^^ゞ

ライブラリ

HCL (HachiCorp Configuration Language)

今回のConfig書式とそのパーサライブラリには、つい最近出たばかりのHCLを採用してみました。

HCLは、Vagrant / Consulなどで有名なHashiCorpの中の人が、libuclから影響を受けて作ったConfiguration言語です。 HCL独自の書式以外に、JSONのパーサも内包していて、どちらでも利用可能になっています。

実装を始めた際にはまだDumperのような機能がなく、実用段階じゃ無いのかなーという印象でした。 が、数日前にDecoderが追加されて、現在はConfigの一括取得が出来るようになり、扱いやすくなりました。

さすがに実装を作り変えるのが面倒だったのでrds-testrunerの実装はDecoderを使っておらず、今後の参考にはならないかもしれません。

hclのDecoder利用サンプルとしては、terraformのconfig周りがhclに置き換わりつつあるので、その辺りを見ると良いかと思います。

HCLのConfigのシンタックス自体も柔軟でわかりやすく、JSON拡張とCompatibleなのも使いやすい感じでした。 また、何より最近のインフラ自動化周りで猛威をふるうHashiCorp製ということもあり、今後が期待できるConfig言語だと思います。

goamz

AWS APIの利用にはgoamzライブラリを使いました。

今回使ったのはgoamz本家ではなく、やはりmitchellhさんのところにあるforkを利用しています。

goamzライブラリは利用者が多いものの、本家のlaunchpadがほぼ更新されておらず、forkが乱立してしまっています。 そんなわけで、適切なforkを探す必要がありました。

色々見比べた結果、RDS周りが充実していたのと、既にプロダクトに利用している信頼性もあり、こちらのforkを使うことにしました。 余談ですが、一部欲しい機能がなかったので、実装したものをpatchとしてPull Requestを出したところ、Mergeしてもらえました\(^o^)/

goamzのforkを統合の動きもあるようで、デファクト・スタンダードとなりつつあるだけに、うまいことまとまって欲しいですね。

cli

主に勉強に使ったコードがterraformだったこともあり、やはりwそこで利用されていたmitchellhのcliライブラリを利用しました。

サブコマンド周りの実装をするのに利用しましたが、手軽で使いやすいです。 サブコマンド周りに加えて、Output周りのUiパッケージも多少整えてあり、簡単に使えました。

ただ、柔軟性はそれほどないので、引数周りの処理を独自実装/flagパッケージなどで自前で作らねばならず、期待値よりは面倒です。

その辺りはcodegengstaのcliのほうが、機能が充実していて使いやすいかもしれません。 次にGoでツールを実装するときには、そちらを使ってみようかなーと思っています。

colorstring

このcolorstringが非常に便利でした。 cliに出力する文字色を切り替えられるライブラリで、仕様も非常にシンプルに出来ています。

fmt.Println(colorstring.Color("[green]こんにちは![reset]こんにちは!"))

などとすれば、色を切り替えられます。 自作すると案外面倒な処理なので、簡単に使えるのは嬉しいです。

ツール

godeb

開発サーバ環境がdebianだったのですが、debianだとsidにしないとGoのバージョンが古くてアレです。 環境整備に頑張ってもいいけど面倒だったので探してみたところ、こちらの記事でgodebを知り、これを使ってGoを用意しました。

使い方は、上記記事を参照してください。 非常に簡単に用意できて、ステキなツールでオススメです。

Godep

アプリケーションの依存関係の管理には、Godepを利用してみました。

go get github.com/tools/godep

でinstallされるので、$GOPATH/binにpathを通しておけばすぐに使えます。

利用するためにはまず、自分のソースコードのgitリポジトリを作っておく必要があります。普通にgit initすれば大丈夫です。

godep save

で依存関係を記録したjsonGodeps/Godeps.json以下にできます。これをリポジトリに入れておけば、他所でcloseした時に

godep get

でライブラリを持ってこれるようになります。 なお、リポジトリGodeps.jsonを入れる際には、.gitignoreGodeps/Readme,Godeps/_warkspaceを追記しておくとよいです。

これも特に苦労すること無く依存関係の管理ができて、とても楽なツールでした。

gox

goxはわりと有名なクロスコンパイルツールです。go getしてきたら

sudo gox -build-toolchain

で環境を整え、

gox

としてビルドできます。ただ、これだとディレクトリ直下に<app-naem>-<dist>-<arch>というバイナリが大量発生するので、自分がビルドするときには

gox -output="build/{{.OS}}-{{.Arch}}/{{.Dir}}"

のようにして、buildディレクトリ以下にそれぞれ分けてビルドされるようにしています。

このツール自体は、もう既にデファクト・スタンダードになっていると言っていいような気がします。 少ない手数でクロスコンパイルができて、とても便利でした。

というわけで

色々とツールとライブラリの感想を書いてきましたが、僕もまだまだ知らないものばっかりなので、ぜひいろんな情報を共有しあえたらな、と思っています。 なにか面白い情報があったら、ぜひ教えて下さい!(`・ω・´)