jpskill.com
✍️ ライティング コミュニティ

go-cobra

Go言語でコマンドラインツールを開発する際に、cobraライブラリを活用して、コマンドやサブコマンドの追加、フラグの設定、シェル補完の実装、ドキュメント生成など、CLI開発に関するあらゆる作業を支援するSkill。

📜 元の英語説明(参考)

Write, scaffold, and debug Go CLI applications using the spf13/cobra library. Use this skill whenever the user wants to build a command-line interface in Go, add commands/subcommands, work with flags (persistent, local, required), implement shell completions, generate documentation, or asks anything about cobra-based CLI development.

🇯🇵 日本人クリエイター向け解説

一言でいうと

Go言語でコマンドラインツールを開発する際に、cobraライブラリを活用して、コマンドやサブコマンドの追加、フラグの設定、シェル補完の実装、ドキュメント生成など、CLI開発に関するあらゆる作業を支援するSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o go-cobra.zip https://jpskill.com/download/8676.zip && unzip -o go-cobra.zip && rm go-cobra.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/8676.zip -OutFile "$d\go-cobra.zip"; Expand-Archive "$d\go-cobra.zip" -DestinationPath $d -Force; ri "$d\go-cobra.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して go-cobra.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → go-cobra フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

Cobra CLI Framework Skill

spf13/cobra ライブラリを使用して、Go CLI アプリケーションの作成、スキャフォールディング、デバッグを行います。ユーザーが Go でコマンドラインインターフェースを構築したい場合、CLI にコマンド/サブコマンドを追加したい場合、フラグ(永続的、ローカル、必須)を扱いたい場合、シェル補完を実装したい場合、ドキュメントを生成したい場合、または cobra ベースの CLI 開発について質問がある場合は、このスキルを使用してください。たとえ「CLI ツールを構築したい」または「Go アプリにコマンドを追加するにはどうすればよいか」と言うだけでも構いません。


クイックスタート

インストール

go get -u github.com/spf13/cobra@latest

CLI ジェネレーターの場合(オプションですが、スキャフォールディングには推奨されます):

go install github.com/spf13/cobra-cli@latest

プロジェクト構造

myapp/
  cmd/
    root.go       # ルートコマンドと Execute()
    version.go    # 追加のコマンド
    serve.go
  main.go         # cmd.Execute() を呼び出すだけ

最小限の main.go

package main

import "myapp/cmd"

func main() {
    cmd.Execute()
}

最小限の root.go

package cmd

import (
    "fmt"
    "os"
    "github.com/spf13/cobra"
)

var rootCmd = &cobra.Command{
    Use:   "myapp",
    Short: "アプリケーションの簡単な説明",
    Long:  `複数行にわたるより詳細な説明。`,
    Run: func(cmd *cobra.Command, args []string) {
        fmt.Println("Hello from myapp!")
    },
}

func Execute() {
    if err := rootCmd.Execute(); err != nil {
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }
}

コアコンセプト

Commands はアクションを表します。Args は物を表します。Flags は動作を修正します。

パターン: APPNAME COMMAND ARG --FLAG

例:

  • hugo server --port=1313 — "server" は command, "port" は flag
  • git clone URL --bare — "clone" は command, "URL" は arg, "bare" は flag

コマンド構造

コマンドの作成

var serveCmd = &cobra.Command{
    Use:   "serve",                           // 呼び出し方
    Short: "サーバーを起動",                // 1 行のヘルプ
    Long:  `詳細な説明はこちら...`,   // 完全なヘルプテキスト
    Example: `  myapp serve --port 8080`,    // 使用例
    Run: func(cmd *cobra.Command, args []string) {
        // コマンドロジックをここに記述
    },
}

func init() {
    rootCmd.AddCommand(serveCmd)
}

主要なコマンドフィールド

Field Purpose
Use 使用パターン: "command [args]"
Aliases 代替名: []string{"s", "srv"}
Short ヘルプ一覧の簡単な説明
Long --help の完全な説明
Example 使用例 (2 つのスペースでインデント)
Run 実際のコマンドロジック
RunE Run と同じですが、エラーを返します
Args 位置引数の検証
ValidArgs シェル補完用の静的リスト
ValidArgsFunction 動的な補完関数
Hidden ヘルプ出力から非表示
Deprecated メッセージ付きで非推奨としてマーク
Version バージョン文字列 (--version を有効にする)

Run vs RunE

呼び出し元にエラーを返す必要がある場合は、RunE を使用します。

var tryCmd = &cobra.Command{
    Use:   "try",
    Short: "何かを試す",
    RunE: func(cmd *cobra.Command, args []string) error {
        if err := doSomething(); err != nil {
            return err  // エラーは Cobra によって処理されます
        }
        return nil
    },
}

フラグ

フラグの種類

Persistent Flags — このコマンドとすべてのサブコマンドで使用可能:

rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config ファイルのパス")
rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "詳細な出力")

Local Flags — この特定のコマンドのみ:

serveCmd.Flags().IntVarP(&port, "port", "p", 8080, "リッスンするポート")
serveCmd.Flags().StringVar(&host, "host", "localhost", "ホストアドレス")

フラグメソッド

Method Example
StringVar --name value
StringVarP --name value または -n value
BoolVar --verbose (true) または --verbose=false
IntVar --count 5
StringSliceVar --tag a --tag b または --tag a,b
StringArrayVar --tag a --tag b (カンマ区切りなし)
CountVarP -v (1), -vv (2), -vvv (3)

必須フラグ

cmd.Flags().StringVarP(&region, "region", "r", "", "AWS リージョン")
cmd.MarkFlagRequired("region")

// 永続フラグの場合
cmd.MarkPersistentFlagRequired("config")

フラググループ

// 一緒に使用する必要があります
cmd.MarkFlagsRequiredTogether("username", "password")

// 一緒に使用できません
cmd.MarkFlagsMutuallyExclusive("json", "yaml")

// 少なくとも 1 つが必要
cmd.MarkFlagsOneRequired("json", "yaml")

// ちょうど 1 つが必要 (両方を組み合わせる)
cmd.MarkFlagsOneRequired("json", "yaml")
cmd.MarkFlagsMutuallyExclusive("json", "yaml")

カウントフラグ (詳細度パターン)

var verbose int

func init() {
    rootCmd.PersistentFlags().CountVarP(&verbose, "verbose", "v", "詳細度 (-v, -vv, -vvv)")
}

// 使用法:
// myapp -v     → verbose = 1
// myapp -vv    → verbose = 2
// myapp -vvv   → verbose = 3

位置引数

組み込みのバリデーター

cmd.Args = cobra.NoArgs              // 引数は許可されません
cmd.Args = cobra.ArbitraryArgs       // 任意の引数 (デフォルト)
cmd.Args = cobra.MinimumNArgs(1)     // 少なくとも N 個
cmd.Args = cobra.MaximumNArgs(3)     // 最大 N 個
cmd.Args = cobra.ExactArgs(2)        // ちょうど N 個
cmd.Args = cobra.RangeArgs(1, 3)     // 最小と最大の間
cmd.Args = cobra.OnlyValidArgs       // ValidArgs リストからのみ

バリデーターの組み合わせ

cmd.Args = cobra.MatchAll(cobra.ExactArgs(2), cobra.OnlyValidArgs)

カスタムバリデーター

cmd.Args = func(cmd *cobra.Command, args []string) error {
    if len(args) < 1 {
        return fmt.Errorf("少なくとも 1 つの引数が必要です")
    }
    if !isValidInput(args[0]) {
        return fmt.Errorf("無効な引数: %s", args[0])
    }
    return nil
}

ライフサイクルフック

フックは次の順序で実行されます。

  1. PersistentPreRun (子に継承されます)
  2. PreRun
  3. Run
  4. PostRun 5

(原文はここで切り詰められています)

📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

Cobra CLI Framework Skill

Write, scaffold, and debug Go CLI applications using the spf13/cobra library. Use this skill whenever the user wants to build a command-line interface in Go, add commands/subcommands to a CLI, work with flags (persistent, local, required), implement shell completions, generate documentation, or asks anything about cobra-based CLI development -- even if they just say "I want to build a CLI tool" or "how do I add commands to my Go app".


Quick Start

Installation

go get -u github.com/spf13/cobra@latest

For the CLI generator (optional but recommended for scaffolding):

go install github.com/spf13/cobra-cli@latest

Project Structure

myapp/
  cmd/
    root.go       # Root command and Execute()
    version.go    # Additional commands
    serve.go
  main.go         # Just calls cmd.Execute()

Minimal main.go

package main

import "myapp/cmd"

func main() {
    cmd.Execute()
}

Minimal root.go

package cmd

import (
    "fmt"
    "os"
    "github.com/spf13/cobra"
)

var rootCmd = &cobra.Command{
    Use:   "myapp",
    Short: "A brief description of your application",
    Long:  `A longer description that spans multiple lines.`,
    Run: func(cmd *cobra.Command, args []string) {
        fmt.Println("Hello from myapp!")
    },
}

func Execute() {
    if err := rootCmd.Execute(); err != nil {
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }
}

Core Concepts

Commands represent actions. Args are things. Flags modify behavior.

Pattern: APPNAME COMMAND ARG --FLAG

Examples:

  • hugo server --port=1313 — "server" is command, "port" is flag
  • git clone URL --bare — "clone" is command, "URL" is arg, "bare" is flag

Command Structure

Creating Commands

var serveCmd = &cobra.Command{
    Use:   "serve",                           // How to call it
    Short: "Start the server",                // One-line help
    Long:  `Detailed description here...`,   // Full help text
    Example: `  myapp serve --port 8080`,    // Usage examples
    Run: func(cmd *cobra.Command, args []string) {
        // Command logic here
    },
}

func init() {
    rootCmd.AddCommand(serveCmd)
}

Key Command Fields

Field Purpose
Use Usage pattern: "command [args]"
Aliases Alternative names: []string{"s", "srv"}
Short Brief description for help listings
Long Full description for --help
Example Usage examples (indent with 2 spaces)
Run The actual command logic
RunE Same as Run but returns error
Args Positional argument validation
ValidArgs Static list for shell completion
ValidArgsFunction Dynamic completion function
Hidden Hide from help output
Deprecated Mark as deprecated with message
Version Version string (enables --version)

Run vs RunE

Use RunE when you need to return errors to the caller:

var tryCmd = &cobra.Command{
    Use:   "try",
    Short: "Try something",
    RunE: func(cmd *cobra.Command, args []string) error {
        if err := doSomething(); err != nil {
            return err  // Error handled by Cobra
        }
        return nil
    },
}

Flags

Flag Types

Persistent Flags — Available to this command AND all subcommands:

rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file path")
rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "verbose output")

Local Flags — Only for this specific command:

serveCmd.Flags().IntVarP(&port, "port", "p", 8080, "port to listen on")
serveCmd.Flags().StringVar(&host, "host", "localhost", "host address")

Flag Methods

Method Example
StringVar --name value
StringVarP --name value or -n value
BoolVar --verbose (true) or --verbose=false
IntVar --count 5
StringSliceVar --tag a --tag b or --tag a,b
StringArrayVar --tag a --tag b (no comma splitting)
CountVarP -v (1), -vv (2), -vvv (3)

Required Flags

cmd.Flags().StringVarP(&region, "region", "r", "", "AWS region")
cmd.MarkFlagRequired("region")

// For persistent flags
cmd.MarkPersistentFlagRequired("config")

Flag Groups

// Must be used together
cmd.MarkFlagsRequiredTogether("username", "password")

// Cannot be used together
cmd.MarkFlagsMutuallyExclusive("json", "yaml")

// At least one required
cmd.MarkFlagsOneRequired("json", "yaml")

// Exactly one required (combine both)
cmd.MarkFlagsOneRequired("json", "yaml")
cmd.MarkFlagsMutuallyExclusive("json", "yaml")

Count Flags (Verbosity Pattern)

var verbose int

func init() {
    rootCmd.PersistentFlags().CountVarP(&verbose, "verbose", "v", "verbosity (-v, -vv, -vvv)")
}

// Usage:
// myapp -v     → verbose = 1
// myapp -vv    → verbose = 2
// myapp -vvv   → verbose = 3

Positional Arguments

Built-in Validators

cmd.Args = cobra.NoArgs              // No args allowed
cmd.Args = cobra.ArbitraryArgs       // Any args (default)
cmd.Args = cobra.MinimumNArgs(1)     // At least N
cmd.Args = cobra.MaximumNArgs(3)     // At most N
cmd.Args = cobra.ExactArgs(2)        // Exactly N
cmd.Args = cobra.RangeArgs(1, 3)     // Between min and max
cmd.Args = cobra.OnlyValidArgs       // Only from ValidArgs list

Combining Validators

cmd.Args = cobra.MatchAll(cobra.ExactArgs(2), cobra.OnlyValidArgs)

Custom Validator

cmd.Args = func(cmd *cobra.Command, args []string) error {
    if len(args) < 1 {
        return fmt.Errorf("requires at least 1 arg")
    }
    if !isValidInput(args[0]) {
        return fmt.Errorf("invalid argument: %s", args[0])
    }
    return nil
}

Lifecycle Hooks

Hooks execute in this order:

  1. PersistentPreRun (inherited by children)
  2. PreRun
  3. Run
  4. PostRun
  5. PersistentPostRun (inherited by children)
var rootCmd = &cobra.Command{
    Use: "app",
    PersistentPreRun: func(cmd *cobra.Command, args []string) {
        // Runs before every command (including subcommands)
        initLogging()
    },
    PersistentPostRun: func(cmd *cobra.Command, args []string) {
        // Runs after every command
        cleanup()
    },
}

var subCmd = &cobra.Command{
    Use: "sub",
    PreRun: func(cmd *cobra.Command, args []string) {
        // Only for this command, before Run
    },
    Run: func(cmd *cobra.Command, args []string) {
        // Main logic
    },
}

Use *RunE variants to return errors:

PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
    return initConfig()
}

Viper Integration

Cobra integrates seamlessly with Viper for configuration management. See references/viper-integration.md for complete documentation.

import "github.com/spf13/viper"

func init() {
    cobra.OnInitialize(initConfig)

    rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file")
    rootCmd.PersistentFlags().String("author", "Me", "author name")

    // Bind flag to viper - priority: flag > env > config > default
    viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author"))
}

func initConfig() {
    if cfgFile != "" {
        viper.SetConfigFile(cfgFile)
    } else {
        home, _ := os.UserHomeDir()
        viper.AddConfigPath(home)
        viper.SetConfigType("yaml")
        viper.SetConfigName(".myapp")
    }

    viper.AutomaticEnv()
    viper.ReadInConfig()
}

// IMPORTANT: Use viper.GetString("author"), not the flag variable
// Flag variables are NOT updated from config file values

Help & Usage

Automatic Features

  • --help / -h flag added automatically
  • help subcommand added when you have subcommands
  • Typo suggestions: myapp srever → "Did you mean 'server'?"

Customization

// Custom help template
cmd.SetHelpTemplate(`Custom help: {{.Use}}`)

// Custom usage template
cmd.SetUsageTemplate(`Usage: {{.UseLine}}`)

// Custom help function
cmd.SetHelpFunc(func(cmd *cobra.Command, args []string) {
    fmt.Println("Custom help!")
})

// Disable suggestions
cmd.DisableSuggestions = true

// Adjust suggestion distance
cmd.SuggestionsMinimumDistance = 1

Version Flag

var rootCmd = &cobra.Command{
    Use:     "myapp",
    Version: "1.0.0",  // Enables --version flag
}

// Custom version template
cmd.SetVersionTemplate(`Version: {{.Version}}`)

Grouping Commands

rootCmd.AddGroup(&cobra.Group{ID: "core", Title: "Core Commands:"})
rootCmd.AddGroup(&cobra.Group{ID: "util", Title: "Utility Commands:"})

serveCmd.GroupID = "core"
versionCmd.GroupID = "util"

Shell Completions

Cobra automatically provides a completion command. For detailed shell completion implementation, see references/completions.md.

Quick usage:

# Bash
source <(myapp completion bash)

# Zsh  
myapp completion zsh > "${fpath[1]}/_myapp"

# Fish
myapp completion fish > ~/.config/fish/completions/myapp.fish

# PowerShell
myapp completion powershell | Out-String | Invoke-Expression

Dynamic Completions

cmd.ValidArgsFunction = func(cmd *cobra.Command, args []string, toComplete string) ([]cobra.Completion, cobra.ShellCompDirective) {
    if len(args) != 0 {
        return nil, cobra.ShellCompDirectiveNoFileComp
    }
    return []cobra.Completion{"option1", "option2"}, cobra.ShellCompDirectiveNoFileComp
}

Documentation Generation

Cobra can generate man pages, markdown, and more. See references/docgen.md for details.

Quick example:

import "github.com/spf13/cobra/doc"

// Markdown
doc.GenMarkdownTree(rootCmd, "./docs")

// Man pages
header := &doc.GenManHeader{Title: "MYAPP", Section: "1"}
doc.GenManTree(rootCmd, header, "./man")

Creating Plugins

For tools like kubectl that use plugins (kubectl-myplugin called as kubectl myplugin):

rootCmd := &cobra.Command{
    Use: "kubectl-myplugin",
    Annotations: map[string]string{
        cobra.CommandDisplayNameAnnotation: "kubectl myplugin",
    },
}

Global Settings

// Enable case-insensitive command matching
cobra.EnableCaseInsensitive = true

// Enable prefix matching (dangerous for production)
cobra.EnablePrefixMatching = true

// Execute all parent hooks (not just first found)
cobra.EnableTraverseRunHooks = true

// Disable command sorting in help
cobra.EnableCommandSorting = false

Testing Commands

func TestServeCommand(t *testing.T) {
    cmd := rootCmd

    // Capture output
    buf := new(bytes.Buffer)
    cmd.SetOut(buf)
    cmd.SetErr(buf)

    // Set args
    cmd.SetArgs([]string{"serve", "--port", "9000"})

    // Execute
    err := cmd.Execute()
    if err != nil {
        t.Fatalf("unexpected error: %v", err)
    }

    // Check output
    if !strings.Contains(buf.String(), "expected") {
        t.Errorf("unexpected output: %s", buf.String())
    }
}

Context Support

var rootCmd = &cobra.Command{
    Use: "myapp",
    Run: func(cmd *cobra.Command, args []string) {
        ctx := cmd.Context()
        // Use context for cancellation, timeouts, etc.
    },
}

// Execute with context
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
rootCmd.ExecuteContext(ctx)

Common Patterns

Subcommand Organization

For large apps, organize subcommands in separate packages:

cmd/
  root.go
  config/
    config.go      # Defines configCmd
    get.go         # config get
    set.go         # config set
// cmd/config/config.go
var ConfigCmd = &cobra.Command{Use: "config", Short: "Manage configuration"}

func init() {
    ConfigCmd.AddCommand(getCmd)
    ConfigCmd.AddCommand(setCmd)
}

// cmd/root.go
import "myapp/cmd/config"

func init() {
    rootCmd.AddCommand(config.ConfigCmd)
}

Error Handling

func Execute() {
    if err := rootCmd.Execute(); err != nil {
        // Error already printed by Cobra
        os.Exit(1)
    }
}

// To silence automatic error printing:
rootCmd.SilenceErrors = true
rootCmd.SilenceUsage = true

Silent/Quiet Mode

var quiet bool

func init() {
    rootCmd.PersistentFlags().BoolVarP(&quiet, "quiet", "q", false, "suppress output")
}

func output(msg string) {
    if !quiet {
        fmt.Println(msg)
    }
}

Reference Files

For more detailed information on specific topics:

  • references/completions.md — Shell completion implementation details
  • references/docgen.md — Documentation generation (man, markdown, yaml, rst)
  • references/advanced.md — Advanced patterns and edge cases