Skip to content

CLI - 命令行框架

CLI 是一个简单强大的命令行框架,用于构建 Go 命令行应用。

特性

  • 单命令和多命令支持
  • 交互式 CLI(文本、选择、确认、密码)
  • 加载动画(Spinner、Progress)
  • 标志和参数支持
  • 环境变量支持
  • 短名称别名

安装

bash
go get github.com/go-zoox/cli

快速开始

单命令 CLI

go
package main

import (
    "fmt"
    "github.com/go-zoox/cli"
)

func main() {
    app := cli.NewSingleProgram(&cli.SingleProgramConfig{
        Name:    "myapp",
        Usage:   "My application",
        Version: "1.0.0",
        Flags: []cli.Flag{
            &cli.StringFlag{
                Name:  "name",
                Usage: "Your name",
                Aliases: []string{"n"},
                Value: "World",
            },
        },
    })

    app.Command(func(ctx *cli.Context) error {
        name := ctx.String("name")
        fmt.Printf("Hello, %s!\n", name)
        return nil
    })

    app.Run()
}

多命令 CLI

go
package main

import (
    "fmt"
    "github.com/go-zoox/cli"
)

func main() {
    app := cli.NewMultipleProgram(&cli.MultipleProgramConfig{
        Name:  "myapp",
        Usage: "My application",
    })

    // 注册 list 命令
    app.Register("list", &cli.Command{
        Name:  "list",
        Usage: "List items",
        Action: func(ctx *cli.Context) error {
            fmt.Println("Listing items...")
            return nil
        },
    })

    // 注册 create 命令
    app.Register("create", &cli.Command{
        Name:  "create",
        Usage: "Create item",
        Flags: []cli.Flag{
            &cli.StringFlag{
                Name:  "name",
                Usage: "Item name",
                Required: true,
            },
        },
        Action: func(ctx *cli.Context) error {
            name := ctx.String("name")
            fmt.Printf("Creating item: %s\n", name)
            return nil
        },
    })

    app.Run()
}

交互式 CLI

文本输入

go
import "github.com/go-zoox/cli/interactive"

name, err := interactive.Text("What is your name?", &interactive.TextOptions{
    Default:  "World",
    Required: true,
})
if err != nil {
    panic(err)
}
fmt.Printf("Hello, %s!\n", name)

选择

go
city, err := interactive.Select(
    "What is your favorite city?",
    []interactive.SelectOption{
        {Label: "Beijing", Value: "beijing"},
        {Label: "Shanghai", Value: "shanghai"},
        {Label: "Guangzhou", Value: "guangzhou"},
    },
    &interactive.SelectOptions{
        Default: "guangzhou",
    },
)

确认

go
confirmed, err := interactive.Confirm(
    "Do you want to continue?",
    &interactive.ConfirmOptions{
        Default: false,
    },
)

密码输入

go
password, err := interactive.Password(
    "Please enter your password:",
    &interactive.PasswordOptions{
        Required: true,
    },
)

加载动画

Spinner

go
import "github.com/go-zoox/cli/loading"

bar := loading.Spinner("Loading...")
for i := 0; i < 100; i++ {
    bar.Add(1)
    time.Sleep(40 * time.Millisecond)
}
bar.Finish()

Progress

go
bar := loading.Progress(100)
for i := 0; i < 100; i++ {
    bar.Add(1)
    time.Sleep(40 * time.Millisecond)
}

标志类型

StringFlag

go
&cli.StringFlag{
    Name:     "name",
    Usage:    "Your name",
    Aliases:  []string{"n"},
    EnvVars:  []string{"NAME"},
    Value:    "default",
    Required: true,
}

IntFlag

go
&cli.IntFlag{
    Name:    "port",
    Usage:   "Port number",
    Aliases: []string{"p"},
    Value:   8080,
}

BoolFlag

go
&cli.BoolFlag{
    Name:    "verbose",
    Usage:   "Verbose output",
    Aliases: []string{"v"},
    Value:   false,
}

StringSliceFlag

go
&cli.StringSliceFlag{
    Name:    "tags",
    Usage:   "Tags",
    Aliases: []string{"t"},
}

更多信息

基于 VitePress 构建