golang构建命令行应用程序插件库gocmd的使用
golang构建命令行应用程序插件库gocmd的使用
简介
gocmd是一个用于构建命令行应用程序的Go库,它提供了丰富的功能来简化命令行应用的开发。
功能特性
- 高级命令行参数处理
- 子命令处理
- 短参数和长参数支持
- 支持多参数(重复或分隔)
- 环境变量支持
- 良好的格式化用法打印
- 自动显示用法和版本信息
- 未知参数处理
- 终端输出表格
- 配置文件模板支持
- 无外部依赖
安装
go get github.com/devfacet/gocmd/v3
基础应用示例
下面是一个完整的使用gocmd构建命令行应用的示例:
package main
import (
"fmt"
"math"
"strings"
"github.com/devfacet/gocmd"
)
func main() {
// 定义命令行参数结构
flags := struct {
Help bool `short:"h" long:"help" description:"显示帮助信息" global:"true"`
Version bool `short:"v" long:"version" description:"显示版本信息"`
VersionEx bool `long:"vv" description:"显示详细版本信息"`
Echo struct {
Settings bool `settings:"true" allow-unknown-arg:"true"`
} `command:"echo" description:"打印参数"`
Math struct {
Sqrt struct {
Number float64 `short:"n" long:"number" required:"true" description:"数字"`
} `command:"sqrt" description:"计算平方根"`
Pow struct {
Base float64 `short:"b" long:"base" required:"true" description:"基数"`
Exponent float64 `short:"e" long:"exponent" required:"true" description:"指数"`
} `command:"pow" description:"计算幂"`
} `command:"math" description:"数学函数" nonempty:"true"`
}{}
// 处理echo命令
gocmd.HandleFlag("Echo", func(cmd *gocmd.Cmd, args []string) error {
fmt.Printf("%s\n", strings.Join(cmd.FlagArgs("Echo")[1:], " "))
return nil
})
// 处理math sqrt命令
gocmd.HandleFlag("Math.Sqrt", func(cmd *gocmd.Cmd, args []string) error {
fmt.Println(math.Sqrt(flags.Math.Sqrt.Number))
return nil
})
// 处理math pow命令
gocmd.HandleFlag("Math.Pow", func(cmd *gocmd.Cmd, args []string) error {
fmt.Println(math.Pow(flags.Math.Pow.Base, flags.Math.Pow.Exponent))
return nil
})
// 初始化应用
gocmd.New(gocmd.Options{
Name: "basic", // 应用名称
Description: "一个基础应用", // 应用描述
Version: "1.0.0", // 版本号
Flags: &flags, // 命令行参数结构
ConfigType: gocmd.ConfigTypeAuto, // 配置类型
})
}
测试
# 运行测试
make test
# 持续测试
make test-ui
# 基准测试
make test-benchmarks
贡献
请参考CONTRIBUTING.md文件了解如何参与贡献。
许可证
MIT许可证
更多关于golang构建命令行应用程序插件库gocmd的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang构建命令行应用程序插件库gocmd的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用gocmd构建Golang命令行应用程序
gocmd是一个轻量级的Golang库,用于快速构建命令行应用程序。它提供了参数解析、子命令、帮助文档生成等功能,非常适合开发CLI工具。下面我将详细介绍如何使用gocmd。
基本安装
首先安装gocmd库:
go get github.com/devfacet/gocmd
基本使用示例
package main
import (
"fmt"
"github.com/devfacet/gocmd"
)
func main() {
// 定义命令选项
options := []gocmd.Option{
{
Name: "version",
ShortName: "v",
Description: "Show version",
Type: gocmd.Bool,
},
{
Name: "config",
ShortName: "c",
Description: "Config file path",
Type: gocmd.String,
},
}
// 创建命令
cmd := gocmd.NewCmd(gocmd.Options{
Name: "myapp",
Version: "1.0.0",
Description: "A simple CLI application",
Flags: options,
// 命令执行函数
Func: func(cmd *gocmd.Cmd, args []string) error {
if cmd.Flags.Bool["version"] {
fmt.Println("Version:", cmd.Version)
return nil
}
if path, ok := cmd.Flags.String["config"]; ok {
fmt.Println("Using config file:", path)
}
fmt.Println("Hello from myapp!")
return nil
},
})
// 执行命令
cmd.Run()
}
子命令支持
gocmd支持创建复杂的多级子命令结构:
package main
import (
"fmt"
"github.com/devfacet/gocmd"
)
func main() {
cmd := gocmd.NewCmd(gocmd.Options{
Name: "myapp",
Version: "1.0.0",
Description: "A CLI application with subcommands",
Commands: []gocmd.Command{
{
Name: "create",
Description: "Create a resource",
Flags: []gocmd.Option{
{
Name: "name",
Description: "Resource name",
Type: gocmd.String,
Required: true,
},
},
Func: func(cmd *gocmd.Cmd, args []string) error {
name := cmd.Flags.String["name"]
fmt.Printf("Creating resource: %s\n", name)
return nil
},
},
{
Name: "delete",
Description: "Delete a resource",
Flags: []gocmd.Option{
{
Name: "id",
Description: "Resource ID",
Type: gocmd.Int,
Required: true,
},
{
Name: "force",
Description: "Force deletion",
Type: gocmd.Bool,
},
},
Func: func(cmd *gocmd.Cmd, args []string) error {
id := cmd.Flags.Int["id"]
force := cmd.Flags.Bool["force"]
fmt.Printf("Deleting resource ID %d (force: %v)\n", id, force)
return nil
},
},
},
})
cmd.Run()
}
高级特性
1. 参数验证
Flags: []gocmd.Option{
{
Name: "port",
Description: "Server port",
Type: gocmd.Int,
Validate: func(value interface{}) error {
port := value.(int)
if port < 1 || port > 65535 {
return fmt.Errorf("port must be between 1 and 65535")
}
return nil
},
},
},
2. 自定义帮助信息
cmd := gocmd.NewCmd(gocmd.Options{
Name: "myapp",
Description: "A custom CLI application",
HelpStyle: gocmd.HelpStyle{
Usage: "Usage: myapp [global flags] <command> [command flags]",
Description: "A longer description of what this application does",
Examples: []string{
"myapp create --name test",
"myapp delete --id 123 --force",
},
},
// ...其他配置
})
3. 环境变量支持
Flags: []gocmd.Option{
{
Name: "api-key",
Description: "API key for authentication",
Type: gocmd.String,
EnvVar: "MYAPP_API_KEY", // 从环境变量读取
},
},
完整示例
下面是一个完整的CLI应用程序示例,包含多个子命令和复杂选项:
package main
import (
"fmt"
"os"
"github.com/devfacet/gocmd"
)
func main() {
// 主命令选项
globalFlags := []gocmd.Option{
{
Name: "verbose",
ShortName: "v",
Description: "Enable verbose output",
Type: gocmd.Bool,
},
{
Name: "config",
ShortName: "c",
Description: "Config file path",
Type: gocmd.String,
Default: "~/.myapp/config.yaml",
},
}
cmd := gocmd.NewCmd(gocmd.Options{
Name: "myapp",
Version: "1.0.0",
Description: "A complete CLI application example",
Flags: globalFlags,
Commands: []gocmd.Command{
{
Name: "user",
Description: "User management",
Commands: []gocmd.Command{
{
Name: "create",
Description: "Create a new user",
Flags: []gocmd.Option{
{
Name: "username",
Description: "User login name",
Type: gocmd.String,
Required: true,
},
{
Name: "email",
Description: "User email address",
Type: gocmd.String,
Required: true,
},
{
Name: "admin",
Description: "Grant admin privileges",
Type: gocmd.Bool,
},
},
Func: func(cmd *gocmd.Cmd, args []string) error {
if cmd.Parent.Flags.Bool["verbose"] {
fmt.Println("Verbose mode enabled")
}
fmt.Printf("Creating user %s (%s)",
cmd.Flags.String["username"],
cmd.Flags.String["email"])
if cmd.Flags.Bool["admin"] {
fmt.Println(" with admin privileges")
}
return nil
},
},
{
Name: "list",
Description: "List all users",
Func: func(cmd *gocmd.Cmd, args []string) error {
fmt.Println("Listing all users...")
// 实际应用中这里会查询并显示用户列表
return nil
},
},
},
},
{
Name: "server",
Description: "Server operations",
Flags: []gocmd.Option{
{
Name: "port",
Description: "Server port",
Type: gocmd.Int,
Default: 8080,
},
},
Func: func(cmd *gocmd.Cmd, args []string) error {
fmt.Printf("Starting server on port %d\n", cmd.Flags.Int["port"])
// 实际应用中这里会启动服务器
return nil
},
},
},
Func: func(cmd *gocmd.Cmd, args []string) error {
// 当没有子命令时显示帮助
cmd.Help()
return nil
},
})
// 运行命令
if err := cmd.Run(); err != nil {
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
os.Exit(1)
}
}
总结
gocmd提供了以下主要功能:
- 简单的命令行参数解析
- 多级子命令支持
- 自动生成帮助信息
- 参数验证和默认值
- 环境变量支持
- 自定义帮助样式
相比标准库flag包,gocmd提供了更高级的功能和更友好的API,特别适合构建复杂的CLI应用程序。它比cobra更轻量,同时提供了足够的功能满足大多数CLI开发需求。
要了解更多高级用法,可以参考gocmd的官方文档和示例代码。