golang强大且符合习惯的命令行参数解析插件库flaggy的使用

Golang强大且符合习惯的命令行参数解析插件库flaggy的使用

flaggy logo

Flaggy是一个快速且符合习惯的命令行标志解析库,具有出色的子命令和位置值支持。标志可以位于任何位置,没有外部依赖。

安装

go get -u github.com/integrii/flaggy

主要特性

  • 非常易于使用
  • 支持35种不同的标志类型
  • 标志可以位于任何位置
  • 默认提供美观且可读的帮助输出
  • 位置子命令
  • 位置参数
  • 当子命令拼写错误时提供建议
  • 嵌套子命令
  • 全局和子命令特定的标志
  • 全局和子命令特定的位置参数
  • 可自定义的帮助模板
  • 标志和子命令可以有短名称和长名称
  • 标志解析速度快,大多数程序解析所有标志和子命令不到1ms

简单示例

// 声明变量及其默认值
var stringFlag = "defaultValue"

// 添加一个标志
flaggy.String(&stringFlag, "f", "flag", "A test string flag")

// 解析标志
flaggy.Parse()

// 使用标志
print(stringFlag)

带子命令的示例

// 声明变量及其默认值
var stringFlag = "defaultValue"

// 创建子命令
subcommand := flaggy.NewSubcommand("subcommandExample")

// 向子命令添加标志
subcommand.String(&stringFlag, "f", "flag", "A test string flag")

// 将子命令添加到解析器的位置1
flaggy.AttachSubcommand(subcommand, 1)

// 解析子命令和所有标志
flaggy.Parse()

// 使用标志
print(stringFlag)

完整示例程序

package main

import "github.com/integrii/flaggy"

// 创建一个版本变量,将在构建时设置
var version = "unknown"

// 将子命令作为全局变量,以便稍后轻松检查它们是否被使用
var mySubcommand *flaggy.Subcommand

// 设置你想要传入标志设置的变量
var testVar string

// 如果你想使用环境变量作为值的默认值,只需用环境的值填充标志
// 如果没有使用与此值对应的标志,则不会更改它
var myVar = os.Getenv("MY_VAR")

func init() {
  // 设置程序的名称和描述。这些会出现在帮助输出中
  flaggy.SetName("Test Program")
  flaggy.SetDescription("A little example program")

  // 你可以通过更改默认解析器(或你自己创建的解析器)上的布尔值来禁用各种功能
  flaggy.DefaultParser.ShowHelpOnUnexpected = false

  // 你可以在默认解析器上设置帮助前缀或后缀
  flaggy.DefaultParser.AdditionalHelpPrepend = "http://github.com/integrii/flaggy"
  
  // 向主程序添加一个标志(这也将在所有子命令中可用)
  flaggy.String(&testVar, "tv", "testVariable", "A variable just for testing things!")

  // 创建任何子命令并设置它们的参数
  mySubcommand = flaggy.NewSubcommand("mySubcommand")
  mySubcommand.Description = "My great subcommand!"
  
  // 向子命令添加标志
  mySubcommand.String(&myVar, "mv", "myVariable", "A variable just for me!")

  // 设置版本并解析所有输入到变量中
  flaggy.SetVersion(version)
  flaggy.Parse()
}

func main(){
    if mySubcommand.Used {
      ...
    }
}

构建命令

# 构建你的应用并设置版本字符串
$ go build -ldflags='-X main.version=1.0.3-a3db3'
$ ./yourApp version
Version: 1.0.3-a3db3
$ ./yourApp --help
Test Program - A little example program
http://github.com/integrii/flaggy

支持的标志类型

Flaggy支持所有Go基本类型的标志,以及这些类型的切片。这包括以下所有类型:

  • string和[]string
  • bool和[]bool
  • 所有int类型和所有[]int类型
  • 所有float类型和所有[]float类型
  • 所有uint类型和所有[]uint类型

其他更具体的类型也可以用作标志类型。它们将使用这些包中包含的标准解析函数自动解析。这包括:

  • net.IP
  • []net.IP
  • net.HardwareAddr
  • []net.HardwareAddr
  • net.IPMask
  • []net.IPMask
  • time.Duration
  • []time.Duration

更多关于golang强大且符合习惯的命令行参数解析插件库flaggy的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang强大且符合习惯的命令行参数解析插件库flaggy的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang命令行参数解析库Flaggy使用指南

Flaggy是一个强大且符合Go语言习惯的命令行参数解析库,它提供了比标准库flag更丰富的功能,同时保持了简单易用的特点。

Flaggy主要特性

  1. 支持子命令(subcommands)
  2. 自动生成帮助信息
  3. 支持位置参数
  4. 支持必选参数
  5. 支持参数验证
  6. 支持默认值设置

基本用法示例

package main

import (
	"fmt"
	"github.com/integrii/flaggy"
)

func main() {
	// 创建一个新的Flaggy实例
	flaggy.SetName("MyApp")
	flaggy.SetDescription("A simple application to demonstrate flaggy usage")
	flaggy.SetVersion("1.0.0")

	// 添加全局选项
	var verbose bool
	flaggy.Bool(&verbose, "v", "verbose", "Enable verbose output")

	// 添加位置参数
	var inputFile string
	flaggy.AddPositionalValue(&inputFile, "input", 1, true, "Input file to process")

	// 解析参数
	flaggy.Parse()

	// 使用参数
	fmt.Printf("Verbose mode: %v\n", verbose)
	fmt.Printf("Input file: %s\n", inputFile)
}

子命令支持

Flaggy对子命令的支持非常出色:

package main

import (
	"fmt"
	"github.com/integrii/flaggy"
)

func main() {
	// 创建主命令
	flaggy.SetName("MyApp")
	flaggy.SetDescription("A CLI with subcommands")

	// 创建子命令
	createCmd := flaggy.NewSubcommand("create")
	createCmd.Description = "Create a new resource"
	
	var createName string
	createCmd.String(&createName, "n", "name", "Name of the resource to create")

	// 另一个子命令
	deleteCmd := flaggy.NewSubcommand("delete")
	deleteCmd.Description = "Delete a resource"
	
	var forceDelete bool
	deleteCmd.Bool(&forceDelete, "f", "force", "Force deletion without confirmation")

	// 添加子命令
	flaggy.AttachSubcommand(createCmd, 1)
	flaggy.AttachSubcommand(deleteCmd, 1)

	// 解析参数
	flaggy.Parse()

	// 根据子命令执行不同逻辑
	switch {
	case createCmd.Used:
		fmt.Printf("Creating resource with name: %s\n", createName)
	case deleteCmd.Used:
		fmt.Printf("Deleting resource (force=%v)\n", forceDelete)
	default:
		flaggy.ShowHelpAndExit("No command specified")
	}
}

高级特性

参数验证

var port int
flaggy.Int(&port, "p", "port", "Port number")
flaggy.DefaultPort = 8080

// 自定义验证函数
flaggy.AddValidator("port", func(val interface{}) error {
    p := val.(int)
    if p < 1 || p > 65535 {
        return fmt.Errorf("port must be between 1 and 65535")
    }
    return nil
})

必选参数

var requiredOption string
flaggy.String(&requiredOption, "r", "required", "This option is required")
flaggy.SetRequired("required")

默认值

var timeout int
flaggy.Int(&timeout, "t", "timeout", "Operation timeout in seconds")
flaggy.DefaultTimeout = 30

帮助信息定制

Flaggy允许你自定义帮助信息:

flaggy.SetHelpTemplate(`{{.ShortDescription}}

Usage:
  {{.CommandPath}} [flags] [subcommand] [args]

Subcommands:{{range .Subcommands}}
  {{.Name}}{{ "\t" }}{{.Description}}{{end}}

Flags:
{{.Flags}}
`)

最佳实践

  1. 清晰的命令结构:合理组织子命令,使CLI直观易用
  2. 详细的帮助信息:为每个命令和选项提供有意义的描述
  3. 参数验证:尽早验证输入,提供友好的错误信息
  4. 默认值:为常用选项设置合理的默认值
  5. 必选参数:明确标记必选参数,避免运行时错误

Flaggy通过其简洁的API和强大的功能,成为了Go语言中处理命令行参数的一个优秀选择,特别适合需要子命令支持的复杂CLI应用程序。

回到顶部