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提供了以下主要功能:

  1. 简单的命令行参数解析
  2. 多级子命令支持
  3. 自动生成帮助信息
  4. 参数验证和默认值
  5. 环境变量支持
  6. 自定义帮助样式

相比标准库flag包,gocmd提供了更高级的功能和更友好的API,特别适合构建复杂的CLI应用程序。它比cobra更轻量,同时提供了足够的功能满足大多数CLI开发需求。

要了解更多高级用法,可以参考gocmd的官方文档和示例代码。

回到顶部