Go言語でConoHa-CLIを作成しているので、 少しずつ進捗報告をしていきたい。

現状

  • Glideを導入
  • cobra / viperを導入
  • TOMLを導入
  • 構造体の外出しでハマる

Glideを導入

Glideはパッケージ管理ソフト。 先日参加したGoビギナーズLT大会! 「最近、Go言語始めました」の会 #4というイベントで、 Go言語のパッケージ管理はGlideを使うのが筋が良いと聞いて導入を決意。 参考サイト: Goビギナーズ - よくある3つの質問 - mom0tomo

go getはローカルマシンに落としてしまうのでパッケージ管理というレベルじゃねーぞ状態だったが、 Glodeではプロジェクトルートに設定ファイル、vendorディレクトリに依存ライブラリが次々と担ぎ込まれ、 npmとほぼ同じ使用感で使う事が出来た。

ただ、LT大会を聞いている限り、Glideを使って入れたらハマったので結局go getでやりました。 使い方教えてという悲痛な声だらけだったので、酷いハマリポイントがあるんだろうなぁ(白目

cobra / viperを導入

cobraはCLI用のライブラリ。 Node.jsに於けるCommander.jsみたいなもん。 Commander.jsはサブコマンドの実装で大ハマリしたが、cobraはわりと素直な動作だしドキュメントが充実してて書きやすい。

お供はviper、蛇繋がりか。 こちらはJSON、YAML、TOML等の設定ファイルをよしなに展開してくれる。 また、cobraとの共存も見越しており、オプション設定にフックしてよしなに上書きすることも可能。

なにそれ便利過ぎィ! ただし、環境変数や複数の設定ファイル読み込み、オプションのオーバーライド等の兼ね合いから、 ファイルへの書き込みはサポートしていない模様。 (なんかファイルに書き出したいという要望がプルリクに上がってて、マージされてるっぽいんだけど、masterにはないもよう)

ファイルへ吐き出す場合は、別途何かしらのライブラリを用意してきて勝手に出力するしかない。 ただまぁ、viperから最新の値を抜き出して上書き出来るから全くのゼロスタートというわけではないかな。

TOMLを導入

TOMLとはGitHubの人が提唱している設定ファイル。 IniとJSONの良いとこ取りといった感じ、インデント無しで配列やオブジェクトを宣言出来るため、ネスト地獄が起こらないのが主張。 最初はYAMLで書いてたのだが、どうもTOMLの方が便利そうなのでそちらを利用することに。

構造体の外出しでハマる

コンフィグファイルまわりは外出ししようとプロジェクトルートにはconfというディレクトリを作成して外出し。 どうしたものか、conf.auth = xxxがundefinedですとコンパイル通さなくなった。 しかしここはさすがのQiitaクオリティ、同じネタでハマった人を発見して無事解決。

参考サイト: Goの構造体をpackageに外出ししてハマッたこと