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

スポンサーリンク

はじめに

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

Cobra とは

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

Kubernetes のkubectlkubectl のプラグインのサンプルGitHub CLIなどで使われています。

Cobra Generator を使ってプロジェクト作成

Cobra では、Cobra Generator が用意されており、cobra-cliを使って、簡単にプロジェクトの初期化(必要なファイルとディレクトリの作成)とコマンドの追加が可能になっています。

まずは、cobra-cliをインストールします。

go install github.com/spf13/cobra-cli@latest

下記でプロジェクトの初期化ができます。

cobra-cli init

初期化をすると下記のようなディレクトリ構成になります。

.
├── cmd/
│   └── root.go # コマンドのルートとなるファイル
├── go.mod
├── go.sum
├── LICENSE
└── main.go # メインのファイル

下記のように--author--licenseで著者やライセンスの設定も可能になります。

cobra-cli init --author "masa" --license mit

main.goの内容は非常にシンプルになっています。やっていることは Cobra の初期化のみです。

package main

import "cobra-simple-cli/cmd"

func main() {
    cmd.Execute()
}

cmd/root.goは、コマンドの大元となるファイルになります。cmd/root.goは下記のように修正します。

package cmd

import (
    "os"

    "github.com/spf13/cobra"
)

var rootCmd = &cobra.Command{
    Use: "cobra-simple-cli", // 使い方
    Long: `Sample CLI tool using cobra.

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.`, // コマンドの説明
}

func Execute() {
    err := rootCmd.Execute()
    if err != nil {
        os.Exit(1)
    }
}

func init() {
}

Useで簡単な使い方を、Longでコマンドの説明(改行あり)を設定できます。

使い方のフォーマットは下記のコメントを参考にするのがいいと思います。

cobra package - github.com/spf13/cobra - Go Packages
Package cobra is a commander providing a simple interface to create powerful modern CLI interfaces.

この状態でコマンドを実行すると下記のようになります。

❯ ./cobra-simple-cli
Sample CLI tool using cobra.

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.

❯ ./cobra-simple-cli -h
Sample CLI tool using cobra.

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.

-hのヘルプオプションはデフォルトで使えるようになっています。

コマンドの追加

では、コマンドを追加してみます。

cobra-cliでコマンドの追加ができます。

cobra-cli add {command}

helloというコマンドを追加してみます。

cobra-cli add hello

追加すると、cmd/hello.goというファイルが作成されます。

.
├── cmd/
│   ├── hello.go
│   └── root.go
├── go.mod
├── go.sum
├── LICENSE
└── main.go

cmd/hello.goを下記のように修正します。コマンドを実行するとHello Worldと出力するのみになっています。

package cmd

import (
    "fmt"

    "github.com/spf13/cobra"
)

// helloCmd represents the hello command
var helloCmd = &cobra.Command{
    Use:   "hello",
    Short: "Echo Hello World",
    Run: func(cmd *cobra.Command, args []string) { // 実行する処理
        fmt.Println("Hello World")
    },
}

func init() {
    rootCmd.AddCommand(helloCmd) // helloコマンドを追加
}

helloコマンドを実行すると、Hello Worldが実行されるようになりました。

❯ ./cobra-simple-cli hello
Hello World

ヘルプを見てみるとhelloコマンドの使い方、また、ルートコマンドの方でも表示されるようになっています。

❯ ./cobra-simple-cli hello -h
Echo Hello World

Usage:
  cobra-simple-cli hello [flags]

Flags:
  -h, --help   help for hello

❯ ./cobra-simple-cli -h
Sample CLI tool using cobra.

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:
  cobra-simple-cli [command]

Available Commands:
  completion  Generate the autocompletion script for the specified shell
  hello       Echo Hello World
  help        Help about any command

Flags:
  -h, --help   help for cobra-simple-cli

Use "cobra-simple-cli [command] --help" for more information about a command.

フラグの実装

次は、引数とフラグを使ったコマンドを追加してみます。

cobra-cliechoコマンドを追加してみます。

cobra-cli add echo

同様に、cmd/echo.goが作成されます。

.
├── cmd/
│   ├── echo.go
│   ├── hello.go
│   └── root.go
├── go.mod
├── go.sum
├── LICENSE
└── main.go

cmd/echo.goを下記のように修正します。引数として受け取った文字列を-nオプションで指定された階数表示するコマンドです。

package cmd

import (
    "fmt"

    "github.com/spf13/cobra"
)

var NumberOfTimes int // オプションの値を格納する変数

// echoCmd represents the echo command
var echoCmd = &cobra.Command{
    Use:   "echo STRING",
    Short: "Echo string which is passed as an argument",
    Args:  cobra.ExactArgs(1),
    RunE: func(cmd *cobra.Command, args []string) error {
        if err := echo(cmd, args[0]); err != nil { // 引数がない場合はエラーを返す
            return err
        }
        return nil
    },
}

func init() {
    rootCmd.AddCommand(echoCmd)
    echoCmd.Flags().IntVarP(&NumberOfTimes, "number", "n", 1, "Number of times to echo ssss") // オプションの指定、変数への格納、デフォルト値の指定
}

// コマンドの処理
func echo(cmd *cobra.Command, str string) error {
    for i := 0; i < NumberOfTimes; i++ {
        fmt.Println(str)
    }
    return nil
}

実行してみると、オプションなしだと引数の文字列を 1 回、-nオプションで表示回数を変更できるようになりました。また、引数なしの場合も、使い方の表示などをしてくれます。

❯ ./cobra-simple-cli echo hoge
hoge

❯ ./cobra-simple-cli echo hoge -n 5
hoge
hoge
hoge
hoge
hoge

❯ ./cobra-simple-cli echo
Error: accepts 1 arg(s), received 0
Usage:
  cobra-simple-cli echo STRING [flags]

Flags:
  -h, --help         help for echo
  -n, --number int   Number of times to echo ssss (default 1)

ヘルプもこれまで同様表示してくれ、自分で追加したオプションの説明も見れるようになっています。

❯ ./cobra-simple-cli echo -h
Echo string which is passed as an argument

Usage:
  cobra-simple-cli echo STRING [flags]

Flags:
  -h, --help         help for echo
  -n, --number int   Number of times to echo ssss (default 1)

❯ ./cobra-simple-cli -h
Sample CLI tool using cobra.

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:
  cobra-simple-cli [command]

Available Commands:
  completion  Generate the autocompletion script for the specified shell
  echo        Echo string which is passed as an argument
  hello       Echo Hello World
  help        Help about any command

Flags:
  -h, --help   help for cobra-simple-cli

Use "cobra-simple-cli [command] --help" for more information about a command.

まとめ

以上、すごくシンプルな CLI を Cobra を使って実装してみました。

CLI の基本的な機能の部分は Cobra がやってくれるので、簡単に実装ができます。まだまだ、他にもできることがあるみたいなので、これから使ってみたいと思います。

参考

タイトルとURLをコピーしました