XGitHub

GolangでCLIを作成できるCobraを試してみた

Published Icon
2024-10-09
Tag Icon

Cobra インストール

Cobra CLI をインストールしておくと、プロジェクトのテンプレートを生成できるコマンドが使えるようになります。

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

プロジェクト初期化

新しいディレクトリを作成し、go init後に Cobra 用にプロジェクトを初期化します。

cd mycli
go mod init mycli
cobra-cli init mycli

上記のコマンドを実行後このようなディレクトリ構成になります。

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

初期状態ではルートコマンドが設定されており、このままgo run main.goを実行すると、cobra に関する説明文が出力されます。

コマンドの追加

取り合えずhelloコマンドを追加してみます。

まずは以下のコマンドを実行します。

cobra-cli add hello

すると、cmd ディレクトリに新しくhello.goファイルが作成されているはずです。

この状態ですでにhelloコマンドが使えるようになっています。

go run main.go hello
> hello called

簡単にhello.goファイルのコードを説明します。初期状態は以下のようになっています。

hello.go
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")
	},
}
 
func init() {
	rootCmd.AddCommand(helloCmd)
 
	// Here you will define your flags and configuration settings.
 
	// Cobra supports Persistent Flags which will work for this command
	// and all subcommands, e.g.:
	// helloCmd.PersistentFlags().String("foo", "", "A help for foo")
 
	// Cobra supports local flags which will only run when this command
	// is called directly, e.g.:
	// helloCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}

&cobra.Commandで囲まれている内容が設定されているコマンドになります。

Use: "hello"で書かれている部分が実際に機能するコマンドです。

ShortLongとありますが、これらは--helpオプションで表示される説明文です。 --helpオプションはこちらで設定していなくてもデフォルトで設定されています。

Run: func(){}がコマンド実行時に呼び出される関数です。

コマンドにフラグ(オプション)を追加

オプションの設定はinit関数で設定します。

hello.go
var name string
 
var helloCmd = &cobra.Command{
	Use:   "hello",
	Short: "Helloと出力します",
	Long:  `このコマンドはHelloと出力するシンプルなコマンドです。`,
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Printf("Hello, %s!\n", name)
	},
}
 
func init() {
	rootCmd.AddCommand(helloCmd)
 
  // StringVarP(変数ポインタ, フラグ名, 短縮フラグ名, デフォルト値, 説明文)
	helloCmd.Flags().StringVarP(&name, "name", "n", "Cobra", "挨拶の対象となる名前")
}

設定したhelloCmdからStringVarP関数を設定するだけで簡単に追加できます。

使い方としては、StringVarP(変数ポインタ, フラグ名, 短縮フラグ名, デフォルト値, 説明文)といった設定ができます。またStringVarという関数もあり、こちらは短縮フラグを設定できない関数になります。(最後に"P"と付く関数が短縮フラグを設定できます。)

go run main.go hello --name "Gopher"
> Hello, Gopher

おわり

ちょっとだけ触ってみましたが、結構簡単に設定できました。次はもうちょっと詳しく調べたいと思います。