Cobraを使ってさっと簡単なCLIを作ってみる

2024.01.26
2024.03.24
プログラミング
CobraGo

はじめに

Cobra を使って、簡単な CLI ツールを作成してみます。

Cobra とは

Cobra とは、Go の CLI フレームワークになります。

Kubernetes のkubectlkubectl のプラグインのサンプル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

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-cliechoコマンドを追加してみます。

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 がやってくれるので、簡単に実装ができます。まだまだ、他にもできることがあるみたいなので、これから使ってみたいと思います。

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee