GCli 是一个用 Golang 编写的简单易用的命令行应用程序和工具库。它提供了丰富的功能,包括运行命令、颜色样式、数据展示、进度显示、交互方法等。
- 多命令支持: 支持添加多个命令及命令别名
- 多级命令: 支持多级命令结构,每级命令可绑定独立的选项
- 选项/参数绑定: 支持从结构体绑定命令选项,支持
flag风格的选项和argument参数 - 颜色输出: 支持丰富的颜色输出,基于 gookit/color
- 交互功能: 内置用户交互方法:
ReadLine,Confirm,Select,MultiSelect等 - 进度显示: 内置进度显示方法:
Txt,Bar,Loading,RoundTrip,DynamicText等 - 自动补全: 支持生成
zsh和bash命令补全脚本 - 帮助信息: 自动生成命令帮助信息,支持颜色显示
- 错误提示: 命令输入错误时会提示相似命令(包含别名提示)
项目采用模块化设计,主要包括以下核心模块:
app.go: 定义 CLI 应用程序结构和主逻辑cmd.go: 定义命令结构和命令执行逻辑gflag/flags.go: 实现命令行参数解析系统interact/interact.go: 提供交互式用户输入功能progress/progress.go: 实现终端进度条显示show/show.go: 提供数据格式化显示工具
# 安装依赖
go get github.com/gookit/gcli/v3
# 编译示例应用
go build ./_examples/cliapp.go# 显示版本信息
./cliapp --version
# 或
./cliapp -V
# 显示应用帮助
./cliapp
# 或
./cliapp -h
# 运行具体命令
./cliapp example -c some.txt -d ./dir --id 34 -n tom -n john val0 val1 val2- 主要功能模块按目录组织(app, cmd, gflag, interact, progress, show 等)
- 每个模块内有明确的接口定义和实现
- 遵循 Go 语言编码规范
项目使用 Go Modules 进行依赖管理,主要依赖包括:
github.com/gookit/color: 提供颜色输出功能github.com/gookit/goutil: 提供通用工具函数golang.org/x/crypto: 提供加密相关功能github.com/gookit/goutil/x/assert- 单元测试断言功能
项目包含完整的测试用例,可通过以下命令运行:
go test -v ./...
github.com/gookit/goutil/x/assert提供单元测试断言功能
package main
import (
"github.com/gookit/gcli/v3"
"github.com/gookit/gcli/v3/_examples/cmd"
)
func main() {
app := gcli.NewApp()
app.Version = "1.0.3"
app.Desc = "this is my cli application"
app.Add(cmd.Example)
app.Add(&gcli.Command{
Name: "demo",
Desc: "this is a description <info>message</> for {$cmd}",
Subs: []*gcli.Command {
// ... allow add subcommands
},
Aliases: []string{"dm"},
Func: func (cmd *gcli.Command, args []string) error {
gcli.Print("hello, in the demo command\n")
return nil
},
})
app.Run(nil)
}import "github.com/gookit/gcli/v3/builtin"
// 在应用中添加生成命令
app.Add(builtin.GenAutoComplete())运行命令生成补全脚本:
./cliapp genac- 丰富的功能且易于使用
- POSIX 风格的短选项合并(
-ab=-a -b):需开启EnhanceShort(gflagConfig) 或命令的严格模式SetStrictMode(true);仅当组合中全部是 bool 短选项时才拆分,EnhanceShort=2额外支持取值紧贴写法-Ostdout=-O stdout。默认关闭以保持兼容。 - 支持设置
Required选项参数 - 支持自定义参数验证器
- 自动检测并收集命令运行时的参数
- 支持独立运行单个命令作为独立应用