GoでCLIを作る

GoでCLIのツールを作ってみる。 今回はCobraというライブラリを使って簡単なCLIツールを作るところまで。

インストール

公式のREADMEにある通り、下記コマンドを実行する。

go install github.com/spf13/cobra

Goのバイナリにパスが通っていない場合は、以下も実行する。

echo 'export PATH="$PATH:$(go env GOPATH)/bin"' >> ~/.zshrc

とりあえずインストールの確認。

❯ cobra -h
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 [command]

Available Commands:
  add         Add a command to a Cobra Application
  completion  generate the autocompletion script for the specified shell
  help        Help about any command
  init        Initialize a Cobra Application

Flags:
  -a, --author string    author name for copyright attribution (default "YOUR NAME")
      --config string    config file (default is $HOME/.cobra.yaml)
  -h, --help             help for cobra
  -l, --license string   name of license for the project
      --viper            use Viper for configuration (default true)

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

Cobra Generator

Cobraは自身もCLIコマンドになっていて、コードのベースを簡単に生成してくれる。 ありがたく使う。

❯ mksir newApp && cd $_
❯ cobra init --pkg-name github.com/tkomatsu/newApp
Using config file: /Users/tkomatsu/.cobra.yaml
Your Cobra application is ready at
/Users/tkomatsu/Documents/42/cli

モジュールのインストール

go.modを作って、必要なモジュールをインストールする。

❯ go mod init github.com/tkomatsu/newApp
go: creating new go.mod: module github.com/tkomatsu/newApp
go: to add module requirements and sums:
	go mod tidy
❯ go get github.com/spf13/cobra
go get: added github.com/inconshreveable/mousetrap v1.0.0
go get: added github.com/spf13/cobra v1.2.1
go get: added github.com/spf13/pflag v1.0.5
❯ go get github.com/spf13/viper
go get: upgraded github.com/fsnotify/fsnotify v1.4.9 => v1.5.1
go get: upgraded github.com/mitchellh/mapstructure v1.4.1 => v1.4.2
go get: upgraded github.com/pelletier/go-toml v1.9.3 => v1.9.4
go get: upgraded github.com/spf13/cast v1.3.1 => v1.4.1
go get: upgraded github.com/spf13/viper v1.8.1 => v1.9.0
go get: upgraded golang.org/x/sys v0.0.0-20210510120138-977fb7262007 => v0.0.0-20210823070655-63515b42dcdf
go get: upgraded golang.org/x/text v0.3.5 => v0.3.6
go get: upgraded gopkg.in/ini.v1 v1.62.0 => v1.63.2

ディレクトリ構成

❯ exa -T
.
├── cmd
│  └── root.go
├── go.mod
├── go.sum
├── LICENSE
└── main.go

リポジトリ直下にmain.goが生成される。

cmd/下にファイルを追加することで、CLIのサブコマンドが実装できる。

サブコマンドを追加するときもCobra自身を使って追加できる

cobra add <sub command>

ビルド

❯ go build
❯ ./newApp
A longer description that spans multiple lines and likely contains
examples and usage of using your application. 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.

デフォルトのメッセージが出ればとりあえずOK。