はじめに
最近業務でGolangを使ったCLIツールを実装する機会があったので、調べた内容を簡単に記載していきます!
【前談】GoでCLIを実装するためのライブラリ
まずはざっくりGoでCLIツールを実装する際に使用するライブラリを調べていきます。GoでCLIツールを作成するためのライブラリとして、以下のものがあるようです。
Cobra
Cobraは、強力なモダンCLIアプリケーションを作成するためのライブラリです。CobraはKubernetes、Hugo、GitHub CLIなど、多くのGoプロジェクトで使用されています。
cli
cli は、Go でコマンドラインアプリケーションを構築するための、シンプルで、高速で、楽しいパッケージです。目標は、開発者が表現力豊かに、高速で配布可能なコマンドラインアプリケーションを書くことができるようにすることです。
go-flags
各ライブラリのスター数
各ライブラリのスター数は以下のような感じ。今回はCobraを使用することにします。
Cobra:30.7kスター
Cli:19.8kスター
Go-flags:2.4kスター
Cobraを使用してCLIツールを実装する
実際にCobraを導入して、CLIツールを実装するまでを解説していきます。
cobra・cobra-cliのインストール
まずはcobraとcobra-cliをインストールしていきます。cobra-cli は cobra アプリケーションとコマンドファイルを生成するためのコマンドライン・プログラムです。これは雛形をブートストラップして、Cobraベースのアプリケーションを迅速に開発することができます。
下記2つのコマンドを実行することで、インストール可能です。
$ go get -u github.com/spf13/cobra@latest
$ go install github.com/spf13/cobra-cli@latest
雛形をブートストラップ
続いて、下記のコマンドを実行してください。
$ cobra-cli init
実行完了すると、下記のようになディレクトリやファイルが自動的に生成されます。
├── cmd
│ └─ root.go
├── go.mod
├── go.sum
├── LICENSE
├── main.go
サブコマンドを追加
cobra-cli add <サブコマンド名>
を実行し、サブコマンドを追加します。今回はinit
というサブコマンドを作成します。
$ cobra-cli add init
このコマンドを実行すると、下記のようにinit.go
ファイルが自動的に作成されます。
├── cmd
│ └─ root.go
│ └─ init.go
ファイルの中身は下記のようになっています。(簡略化するためにコメントなどは削除してあります。)
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
var initCmd = &cobra.Command{
Use: "init",
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) {
// サブコマンドinitを叩くと実行したい処理をこちらに記載します
fmt.Println("init called")
},
}
func init() {
rootCmd.AddCommand(initCmd)
}
ファイルを作成した段階ではfmt.Println("init called")
しか記載されていないので、実行しても「init called」と表示されるだけですが、確認のために実行してみます
$ go run main.go init
init called
うまく動いていることが確認できますね!あとはご自身で必要な処理をどんどん追加で実装していってください。
最後に
今回は簡単にCLIツールを実装するための手段と、Cobraの実装の進め方を解説しました。何かご指摘等あればお気軽にコメントください!