urfave/cli

シンプルで高速、楽しいコマンドラインアプリケーションを構築するためのGoパッケージ。表現力豊かなAPIが特徴です。

goclisimplefast

フレームワーク

urfave/cli

概要

urfave/cliは、Goでシンプルで高速、楽しいコマンドラインアプリケーションを構築するためのパッケージです。表現力豊かなAPIが特徴で、小規模から中規模のCLIツールで人気を集めています。使いやすさとシンプルさを重視する開発者に支持されており、多くのGoプロジェクトで採用されています。

詳細

urfave/cliは、長年にわたってGoのCLIライブラリとして広く使用されており、現在v2系が安定版として提供されています。v3系も開発中で、よりモダンなAPIを提供予定です。このライブラリは、コマンド、フラグ、サブコマンド、自動ヘルプ生成、シェル補完など、本格的なCLIアプリケーションに必要な機能を包括的に提供しています。

主な特徴

  • 表現力豊かなAPI: 直感的で読みやすいコード記述が可能
  • フラグとコマンドサポート: 豊富なフラグタイプとサブコマンド機能
  • 自動ヘルプ生成: ヘルプメッセージとUsageの自動生成
  • シェル補完: Bash、Zsh、Fish、PowerShellでの補完をサポート
  • 柔軟な設定: アプリケーションの詳細なカスタマイズが可能
  • テスト支援: CLIアプリケーションのテストを容易にする機能
  • 軽量: 最小限の依存関係で高いパフォーマンス

メリット・デメリット

メリット

  • 学習コストの低さ: シンプルで直感的なAPI設計
  • 高い柔軟性: 様々なCLIパターンに対応可能
  • 豊富な機能: 本格的なCLIアプリケーションに必要な機能を網羅
  • 活発なコミュニティ: 継続的な開発とメンテナンス
  • 優れたドキュメント: 豊富な例とチュートリアル

デメリット

  • Cobraと比較した採用率: GoではCobraの方が広く採用されている
  • 大規模アプリケーション: 非常に複雑なCLI構造では他の選択肢も検討の余地
  • バージョン間の違い: v1、v2、v3で若干のAPI差異がある

主要リンク

書き方の例

package main

import (
	"fmt"
	"log"
	"os"

	"github.com/urfave/cli/v2"
)

func main() {
	app := &cli.App{
		Name:  "greet",
		Usage: "挨拶アプリケーション",
		Flags: []cli.Flag{
			&cli.StringFlag{
				Name:    "lang",
				Aliases: []string{"l"},
				Value:   "japanese",
				Usage:   "挨拶の言語",
			},
			&cli.BoolFlag{
				Name:    "uppercase",
				Aliases: []string{"u"},
				Usage:   "大文字で表示",
			},
		},
		Commands: []*cli.Command{
			{
				Name:    "hello",
				Aliases: []string{"h"},
				Usage:   "hello コマンド",
				Action: func(c *cli.Context) error {
					name := "世界"
					if c.NArg() > 0 {
						name = c.Args().Get(0)
					}
					
					greeting := "こんにちは"
					if c.String("lang") == "english" {
						greeting = "Hello"
					}
					
					msg := fmt.Sprintf("%s %s!", greeting, name)
					if c.Bool("uppercase") {
						msg = strings.ToUpper(msg)
					}
					
					fmt.Println(msg)
					return nil
				},
			},
			{
				Name:  "goodbye",
				Usage: "goodbye コマンド",
				Flags: []cli.Flag{
					&cli.BoolFlag{
						Name:  "formal",
						Usage: "丁寧な挨拶を使用",
					},
				},
				Action: func(c *cli.Context) error {
					name := "世界"
					if c.NArg() > 0 {
						name = c.Args().Get(0)
					}
					
					if c.Bool("formal") {
						fmt.Printf("さようなら、%sさん\n", name)
					} else {
						fmt.Printf("バイバイ、%s!\n", name)
					}
					return nil
				},
			},
		},
		Action: func(c *cli.Context) error {
			fmt.Println("挨拶アプリケーションです。help でヘルプを表示します。")
			return nil
		},
	}

	if err := app.Run(os.Args); err != nil {
		log.Fatal(err)
	}
}