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"},
}