urfave/cli
シンプルで高速、楽しいコマンドラインアプリケーションを構築するためのGoパッケージ。表現力豊かなAPIが特徴です。
フレームワーク
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)
}
}