👻

【Go】手軽にCLIツールを作成できるCobraを触ってみた

に公開

概要

  • Go製のCLIツールを簡単に開発できるフレームワークCobraを触ってみた
  • インストール方法や簡単なサンプルコード

インストール、動作確認

  1. cobraをインストール
$ go get -u github.com/spf13/cobra@latest
  1. cobra-cliをインストール
$ go install github.com/spf13/cobra-cli@latest
  1. テンプレート作成
cobra-cli init --license MIT --viper=false

下記のようなテンプレートが作成される

├── cmd
│   └── root.go
├── go.mod
├── go.sum
├── LICENSE
├── main.go
  1. 動作確認
$ go run main.go
A longer description that spans multiple lines and likely contains
examples and usage of using your application. For example:

コマンドを追加してみる

例えば「hello」というコマンドを作りたい場合は、

cobra-cli add hello

cmd/hello.go が自動生成される

/*
Copyright © 2025 NAME HERE <EMAIL ADDRESS>

*/
package cmd

import (
	"fmt"

	"github.com/spf13/cobra"
)

// 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")
	},
}

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")
}

実行してみる

$ go run main.go hello
hello called

フラグの追加

package cmd

import (
	"fmt"

	"github.com/spf13/cobra"
)


var name string

// helloCmd represents the hello command
var helloCmd = &cobra.Command{
	Use:   "hello",
	Short: "挨拶を表示するコマンド",
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Printf("Hello, %s!\n", name)
	},
}

func init() {
	rootCmd.AddCommand(helloCmd)
	
	// フラグ追加
	helloCmd.Flags().StringVarP(&name, "name", "n", "World", "名前を指定できます")
}

実行してみる

$ go run main.go hello
# => Hello, World!

$ go run main.go hello --name Taro
# => Hello, Taro!

$ go run main.go hello -n Jiro
# => Hello, Jiro!

まとめ

  • インストールから実行まで非常に手軽だった
  • まだ作りたいCLI思い浮かばないが、機会があれば使っていきたい
GitHubで編集を提案

Discussion