CobraでCLIツール自動化
Go実践でCLIツール作成の基礎
Go言語は静的型付けと高速実行が特徴で、CLIツール作成に最適です。標準パッケージのflagを使えば簡単にコマンドライン引数を解析できます。まずはシンプルな「Hello, World!」ツールを作り、go run main.go --name=Alice のようにフラグを渡す方法を確認します。
package main
import (
"flag"
"fmt"
)
func main() {
name := flag.String("name", "World", "名前を指定")
flag.Parse()
fmt.Printf("Hello, %s!\n", *name)
}
この例では--nameフラグを定義し、デフォルト値を設定しています。flag.Parse()で実際に引数を解析し、*nameで値を取得します。Go実践の第一歩として、こうした基本的なフラグ処理をマスターしておくと、後の拡張がスムーズになります。
cobraとflagでサブコマンドとフラグ処理
CLIツールが大規模になると、サブコマンドや複雑なフラグ構成が必要になります。cobraはGoで最も人気のあるCLIフレームワークで、サブコマンドの定義やヘルプ生成を簡単に行えます。以下は、appというツールにaddとremoveというサブコマンドを追加する例です。
package main
import (
"github.com/spf13/cobra"
"fmt"
)
var rootCmd = &cobra.Command{
Use: "app",
Short: "サンプルCLIツール",
}
var addCmd = &cobra.Command{
Use: "add [name]",
Short: "名前を追加",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
fmt.Printf("追加: %s\n", args[0])
},
}
var removeCmd = &cobra.Command{
Use: "remove [name]",
Short: "名前を削除",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
fmt.Printf("削除: %s\n", args[0])
},
}
func init() {
rootCmd.AddCommand(addCmd)
rootCmd.AddCommand(removeCmd)
}
func main() {
if err := rootCmd.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
この構成では、app add Aliceやapp remove Bobのようにサブコマンドを呼び出せます。cobraは自動でヘルプを生成し、--helpで詳細を表示します。フラグ処理はcmd.Flags().StringVarPなどで追加でき、flagパッケージと組み合わせて柔軟に設計できます。
ツール開発と自動化の実践
CLIツールは単なるコマンド実行だけでなく、ビルドやデプロイの自動化に活用できます。Goのビルドツールチェーンはgo buildでバイナリを生成し、makeやjustでビルドスクリプトを管理します。さらに、docker buildxを使えばマルチプラットフォームイメージを簡単に作成できます。
# Makefile例
build:
go build -o bin/app
docker:
docker buildx build --platform linux/amd64,linux/arm64 -t myorg/app:latest .
CI/CDパイプライン(GitHub Actions, GitLab CI, Jenkinsなど)に組み込むことで、コードがプッシュされるたびに自動でビルド・テスト・デプロイが走ります。これにより、ツール開発のリリースサイクルが短縮され、品質が向上します。
対話モードでユーザー体験を向上
CLIツールはコマンドラインだけでなく、対話モード(REPL)を提供することでユーザー体験を大幅に向上させます。surveyやpromptuiといったライブラリを使えば、入力プロンプトや選択メニューを簡単に実装できます。
package main
import (
"github.com/AlecAivazis/survey/v2"
)
func main() {
var name string
prompt := &survey.Input{
Message: "名前を入力してください:",
}
survey.AskOne(prompt, &name)
fmt.Printf("こんにちは、%s!\n", name)
}
対話モードはスクリプト化が難しい操作や、ユーザーにとって直感的な入力を必要とする場面で有効です。CLIツールに対話モードを組み込むことで、初心者でも簡単に使えるようになり、ツールの採用率が上がります。
コメント
コメントを投稿