Goでcobraを使ってスクリプトを組んでみた

GoでCLIから叩けるスクリプトを作ってみたいなと思ったので、cobraを使って作ってみました。

最近なかなか時間を確保できなくて echo さわるのもとまっていたので、休憩とちょっとした勉強がてらcobraに乗っかりつつ、 Punk API にリクエストを送るようなスクリプトを書いてみました。

環境

  • Go 1.15
  • spf13/cobra v1.1.3

Punk API

PUNK APIでクラフトビールの情報を取得しながらAPI利用を学ぶ🍻
ここから。

ビール情報を引っ張れるAPIで、結構シンプルなので遊びに使わせてもらうには良さそうだなーって感じでした。
CLIとして置いといて、ビール飲みたいよなーと思った時におもむろにコマンド叩いて取れたら面白そうじゃないっていう。冷蔵庫に在庫があるかはともかく。

作る

spf13/cobra: A Commander for modern Go CLI interactions

雛形からルートコマンドの生成

雛形が生成できるようだったのでやりました

$ cobra init --pkg-name punkcli

$ tree
├── LICENSE
├── cmd
│   └── root.go
├── go.mod
├── go.sum
└── main.go

main.go にはコマンドを呼び出す部分だけ記載があって、あとは cmn/root.go の中に。

今回はPunk APIのランダムに1件取り出すAPIをお借りしたので、サブコマンドを作る形で作ってみました。

サブコマンドを生成

$ cobra add random

cmd/random.go が生成されて、この中でルートコマンドへの追加を行う (ここが最初分からなかった)

var randomCmd = &cobra.Command{
	Use:   "random",
    // 中略
	Run: func(cmd *cobra.Command, args []string) {
		res := random()
        // 以下略
	},
}

func init() {
    // ここで上で定義したコマンドをサブコマンドとしてルートコマンドに追加してる
	rootCmd.AddCommand(randomCmd)
}

あとは、いくつかの記事を参考にリクエストして、標準出力まで持っていった感じです。

JSONのパースが型の関係でちょっとだけ詰まった。

今後

  1. フラグで追加動作をさせるような感じに調整したい
  2. テスト書いておきたい
  3. ドキュメントが生成できるらしいので試す

フラグで追加動作をさせるような感じに調整したい

現状叩くと通信して結果を標準出力するだけなんだけど、JSONファイルで吐けるとなにかに使えるかなーと思うのでそれをやっておきたい。

テスト書いておきたい

書捨てっぽいところはあるんだけど、良い機会なので書いておきたいのと、ちょくちょく良さそうな記事が出てくるので読んでテスト書いておきたい。

ドキュメントが生成できるらしいので試す

ドキュメント生成の機能も載ってるらしい。イケメンすぎんか

main内で出力方法を記載しておくと、Markdownで生成できたりするらしい。

やってみて

雛形生成できたり必要なものが大体揃ってるか同じ作者の人が別で用意してくれてたりとか充実した環境そうな印象でした。
Goでコマンドラインツールを作るときの鉄板ライブラリ - Qiita

標準ライブラリにもCLIを作るためのパッケージがあるようで、それだけでも十分っていう話は聞くので、そっちはまた時間作って触りたいかな。

仕事ではバッチ処理や大きめのデータ収集なんかにPHPでスクリプトを書いてたりするんですが、こういうところをGoでいい感じに処理できたら嬉しいようなーと妄想してます。