ども、K69 です。
Go言語で「CLIを作成するときに良いパッケージないかな?」と探してみるとcobraを見つけました。
じゃ、「cobraについて調べてみるか!」と
ウニウニしたのがこの記事です。
対象読者
- Go言語でCLIを作成する人。
前提条件
- windows10(home)の環境
- golangがインストール済み
※ 環境はchocolateyでのセットアップがオススメ。こちらも参照
はじめに
cobraって何ができるの?
- テンプレートを自動生成ツールcobra/cobraでベースとなるソースを作成し、
- 用意されたパッケージを使って簡単にCLIアプリを作成できます。
- また、JSON やYAML による設定ファイルを簡単に扱うためのパッケージviperとの相性も良いです。
手順
1. 環境の準備
ワークスペース(WS)を作成し、go get でパッケージを取得します。
下記をコピペ。
set WS=%HOMEDRIVE%%HOMEPATH%\git\go-cobra
mkdir %WS%
cd %WS%
set GOPATH=%WS%
mkdir bin
go get -v -u github.com/spf13/cobra
go get -v -u github.com/spf13/cobra/cobra
2. 今回作成するサンプル CLIアプリ mytool とは?
mytoolのサブコマンド(hello)とパラメタ(”keita69sawada”)を渡すと、"Hello, [パラメタ] !!" を返却するCLIアプリケーションです。
mytool hello keita69sawada
>> Hello, keita69sawada !!
2. CLIアプリのテンプレートを作成
mytoolCLIアプリのテンプレートを作成します。
下記をコピペ。
%GOPATH%/bin/cobra.exe init mytool
3. CLIアプリのサブコマンド テンプレートを作成
hello サブコマンドのテンプレートを作成します。
下記をコピペ。
cd %GOPATH%/src
%GOPATH%/bin/cobra.exe add hello
4. 実行ファイル(.exe)の作成
作成されたテンプレートをコンパイルします。
下記をコピペ。
go install mytool
5. mytoolCLIアプリの実行
何も修正を加えていない状態で実行してみます。
5.1 helloサブコマンドを実行
下記をコピペ。
%GOPATH\bin\mytool hello
helloサブコマンドの呼び出しがわかるメッセージを表示しました。
※ 6. フォルダ構成の★hello.goにこのメッセージ表示の実装があります
%WS%\src\mytool>%GOPATH%\bin\mytool hello
hello called
5.2 mytoolにサブコマンドを指定しないで実行
下記をコピペ。
%GOPATH\bin\mytool
テンプレートの状態でヘルプメッセージが出力されました!!
%WS%\src\mytool>%GOPATH%\bin\mytool
A longer description that spans multiple lines and likely contains
examples and usage of using your application. For example:
Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.
Usage:
mytool [command]
Available Commands:
hello A brief description of your command
help Help about any command
Flags:
--config string config file (default is $HOME/.mytool.yaml)
-h, --help help for mytool
-t, --toggle Help message for toggle
Use "mytool [command] --help" for more information about a command.
6. フォルダ構成
ここまででフォルダ構成は下記のようになっているはず。
※ パッケージ類は省略してます
├─bin
│ cobra.exe
│ mytool.exe
│
├─pkg
│
└─src
│
└─mytool
│ LICENSE
│ main.go
│
└─cmd
hello.go ★サブコマンドの実装はこのファイル
root.go
7. hello.goを修正します。
サンプル CLIアプリ mytool の仕様に合わせてhello.goを修正します。
// helloCmd represents the hello command
var helloCmd = &cobra.Command{
Use: "hello",
Short: "A brief description of your command",
Long: `A longer description that spans multiple lines and likely contains examples
and usage of using your command. For example:
Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.`,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("hello called")
},
}
修正するのは★の1行だけ。
// helloCmd represents the hello command
var helloCmd = &cobra.Command{
Use: "hello",
Short: "A brief description of your command",
Long: `A longer description that spans multiple lines and likely contains examples
and usage of using your command. For example:
Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.`,
Run: func(cmd *cobra.Command, args []string) {
fmt.Printf("Hello, %s !!", args[0]) ★ここを修正
},
}
ビルド&実行してみる。
下記をコピペ。
go install mytool
%GOPATH\bin\mytool hello keita69sawada
できた!!
%WS%\go-cobra>%GOPATH%\bin\mytool hello keita69sawada
Hello, keita69sawada !!
まとめ
まだ簡単な使い方しかできていないですが、ヘルプが含まれているテンプレートがサクサク作れるところ気に入りました。
複数人でプログラム実装する場合も、AさんはXXXサブコマンド、BさんはYYYサブコマンド、CさんはZZZサブコマンドとしても共通のベースコードがあれば俗人的な仕様にならないし安心ですね。
JSON やYAML による設定ファイルを簡単に扱う機能を使っていないので、機会があれば遊んでみようと思います。
参考URL
- CLI作成支援パッケージ Cobra を使い、Go 言語でコマンドラインツールを作ってみる
https://qiita.com/kent_ocean/items/eb518c0816addd69f353