スキップしてメイン コンテンツに移動

CobraでCLIツール自動化

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というツールにaddremoveというサブコマンドを追加する例です。

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 Aliceapp remove Bobのようにサブコマンドを呼び出せます。cobraは自動でヘルプを生成し、--helpで詳細を表示します。フラグ処理はcmd.Flags().StringVarPなどで追加でき、flagパッケージと組み合わせて柔軟に設計できます。

ツール開発と自動化の実践

CLIツールは単なるコマンド実行だけでなく、ビルドやデプロイの自動化に活用できます。Goのビルドツールチェーンはgo buildでバイナリを生成し、makejustでビルドスクリプトを管理します。さらに、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)を提供することでユーザー体験を大幅に向上させます。surveypromptuiといったライブラリを使えば、入力プロンプトや選択メニューを簡単に実装できます。

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ツールに対話モードを組み込むことで、初心者でも簡単に使えるようになり、ツールの採用率が上がります。

この記事はAIによって作成されました。

コメント