Cobraを使ってさっと簡単なCLIを作ってみる
はじめに
Cobra を使って、簡単な CLI ツールを作成してみます。
Cobra とは
Cobra とは、Go の CLI フレームワークになります。
Kubernetes のkubectlやkubectl のプラグインのサンプル、GitHub CLIなどで使われています。
Cobra Generator を使ってプロジェクト作成
Cobra では、Cobra Generator が用意されており、cobra-cli
を使って、簡単にプロジェクトの初期化(必要なファイルとディレクトリの作成)とコマンドの追加が可能になっています。
まずは、cobra-cli
をインストールします。
1go install github.com/spf13/cobra-cli@latest
下記でプロジェクトの初期化ができます。
1cobra-cli init
初期化をすると下記のようなディレクトリ構成になります。
1.
2├── cmd/
3│ └── root.go # コマンドのルートとなるファイル
4├── go.mod
5├── go.sum
6├── LICENSE
7└── main.go # メインのファイル
下記のように--author
や--license
で著者やライセンスの設定も可能になります。
1cobra-cli init --author "masa" --license mit
main.go
の内容は非常にシンプルになっています。やっていることは Cobra の初期化のみです。
1package main
2
3import "cobra-simple-cli/cmd"
4
5func main() {
6 cmd.Execute()
7}
cmd/root.go
は、コマンドの大元となるファイルになります。cmd/root.go
は下記のように修正します。
1package cmd
2
3import (
4 "os"
5
6 "github.com/spf13/cobra"
7)
8
9var rootCmd = &cobra.Command{
10 Use: "cobra-simple-cli", // 使い方
11 Long: `Sample CLI tool using cobra.
12
13Cobra is a CLI library for Go that empowers applications.
14This application is a tool to generate the needed files
15to quickly create a Cobra application.`, // コマンドの説明
16}
17
18func Execute() {
19 err := rootCmd.Execute()
20 if err != nil {
21 os.Exit(1)
22 }
23}
24
25func init() {
26}
Use
で簡単な使い方を、Long
でコマンドの説明(改行あり)を設定できます。
使い方のフォーマットは下記のコメントを参考にするのがいいと思います。
cobra package - github.com/spf13/cobra - Go Packages
この状態でコマンドを実行すると下記のようになります。
1❯ ./cobra-simple-cli
2Sample CLI tool using cobra.
3
4Cobra is a CLI library for Go that empowers applications.
5This application is a tool to generate the needed files
6to quickly create a Cobra application.
7
8❯ ./cobra-simple-cli -h
9Sample CLI tool using cobra.
10
11Cobra is a CLI library for Go that empowers applications.
12This application is a tool to generate the needed files
13to quickly create a Cobra application.
-h
のヘルプオプションはデフォルトで使えるようになっています。
コマンドの追加
では、コマンドを追加してみます。
cobra-cli
でコマンドの追加ができます。
1cobra-cli add {command}
hello
というコマンドを追加してみます。
1cobra-cli add hello
追加すると、cmd/hello.go
というファイルが作成されます。
1.
2├── cmd/
3│ ├── hello.go
4│ └── root.go
5├── go.mod
6├── go.sum
7├── LICENSE
8└── main.go
cmd/hello.go
を下記のように修正します。コマンドを実行するとHello World
と出力するのみになっています。
1package cmd
2
3import (
4 "fmt"
5
6 "github.com/spf13/cobra"
7)
8
9// helloCmd represents the hello command
10var helloCmd = &cobra.Command{
11 Use: "hello",
12 Short: "Echo Hello World",
13 Run: func(cmd *cobra.Command, args []string) { // 実行する処理
14 fmt.Println("Hello World")
15 },
16}
17
18func init() {
19 rootCmd.AddCommand(helloCmd) // helloコマンドを追加
20}
hello
コマンドを実行すると、Hello World
が実行されるようになりました。
1❯ ./cobra-simple-cli hello
2Hello World
ヘルプを見てみるとhello
コマンドの使い方、また、ルートコマンドの方でも表示されるようになっています。
1❯ ./cobra-simple-cli hello -h
2Echo Hello World
3
4Usage:
5 cobra-simple-cli hello [flags]
6
7Flags:
8 -h, --help help for hello
9
10❯ ./cobra-simple-cli -h
11Sample CLI tool using cobra.
12
13Cobra is a CLI library for Go that empowers applications.
14This application is a tool to generate the needed files
15to quickly create a Cobra application.
16
17Usage:
18 cobra-simple-cli [command]
19
20Available Commands:
21 completion Generate the autocompletion script for the specified shell
22 hello Echo Hello World
23 help Help about any command
24
25Flags:
26 -h, --help help for cobra-simple-cli
27
28Use "cobra-simple-cli [command] --help" for more information about a command.
フラグの実装
次は、引数とフラグを使ったコマンドを追加してみます。
cobra-cli
でecho
コマンドを追加してみます。
1cobra-cli add echo
同様に、cmd/echo.go
が作成されます。
1.
2├── cmd/
3│ ├── echo.go
4│ ├── hello.go
5│ └── root.go
6├── go.mod
7├── go.sum
8├── LICENSE
9└── main.go
cmd/echo.go
を下記のように修正します。引数として受け取った文字列を-n
オプションで指定された階数表示するコマンドです。
1package cmd
2
3import (
4 "fmt"
5
6 "github.com/spf13/cobra"
7)
8
9var NumberOfTimes int // オプションの値を格納する変数
10
11// echoCmd represents the echo command
12var echoCmd = &cobra.Command{
13 Use: "echo STRING",
14 Short: "Echo string which is passed as an argument",
15 Args: cobra.ExactArgs(1),
16 RunE: func(cmd *cobra.Command, args []string) error {
17 if err := echo(cmd, args[0]); err != nil { // 引数がない場合はエラーを返す
18 return err
19 }
20 return nil
21 },
22}
23
24func init() {
25 rootCmd.AddCommand(echoCmd)
26 echoCmd.Flags().IntVarP(&NumberOfTimes, "number", "n", 1, "Number of times to echo ssss") // オプションの指定、変数への格納、デフォルト値の指定
27}
28
29// コマンドの処理
30func echo(cmd *cobra.Command, str string) error {
31 for i := 0; i < NumberOfTimes; i++ {
32 fmt.Println(str)
33 }
34 return nil
35}
実行してみると、オプションなしだと引数の文字列を 1 回、-n
オプションで表示回数を変更できるようになりました。また、引数なしの場合も、使い方の表示などをしてくれます。
1❯ ./cobra-simple-cli echo hoge
2hoge
3
4❯ ./cobra-simple-cli echo hoge -n 5
5hoge
6hoge
7hoge
8hoge
9hoge
10
11❯ ./cobra-simple-cli echo
12Error: accepts 1 arg(s), received 0
13Usage:
14 cobra-simple-cli echo STRING [flags]
15
16Flags:
17 -h, --help help for echo
18 -n, --number int Number of times to echo ssss (default 1)
ヘルプもこれまで同様表示してくれ、自分で追加したオプションの説明も見れるようになっています。
1❯ ./cobra-simple-cli echo -h
2Echo string which is passed as an argument
3
4Usage:
5 cobra-simple-cli echo STRING [flags]
6
7Flags:
8 -h, --help help for echo
9 -n, --number int Number of times to echo ssss (default 1)
10
11❯ ./cobra-simple-cli -h
12Sample CLI tool using cobra.
13
14Cobra is a CLI library for Go that empowers applications.
15This application is a tool to generate the needed files
16to quickly create a Cobra application.
17
18Usage:
19 cobra-simple-cli [command]
20
21Available Commands:
22 completion Generate the autocompletion script for the specified shell
23 echo Echo string which is passed as an argument
24 hello Echo Hello World
25 help Help about any command
26
27Flags:
28 -h, --help help for cobra-simple-cli
29
30Use "cobra-simple-cli [command] --help" for more information about a command.
まとめ
以上、すごくシンプルな CLI を Cobra を使って実装してみました。
CLI の基本的な機能の部分は Cobra がやってくれるので、簡単に実装ができます。まだまだ、他にもできることがあるみたいなので、これから使ってみたいと思います。
参考
- spf13/cobra: A Commander for modern Go CLI interactions
- cobra/site/content/user_guide.md at main · spf13/cobra
- spf13/cobra-cli: Cobra CLI tool to generate applications and commands
- Cobra. Dev
- kubernetes/sample-cli-plugin: Sample kubectl plugin