golang强大且符合习惯的命令行参数解析插件库flaggy的使用
Golang强大且符合习惯的命令行参数解析插件库flaggy的使用
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主要特性
- 支持子命令(subcommands)
- 自动生成帮助信息
- 支持位置参数
- 支持必选参数
- 支持参数验证
- 支持默认值设置
基本用法示例
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}}
`)
最佳实践
- 清晰的命令结构:合理组织子命令,使CLI直观易用
- 详细的帮助信息:为每个命令和选项提供有意义的描述
- 参数验证:尽早验证输入,提供友好的错误信息
- 默认值:为常用选项设置合理的默认值
- 必选参数:明确标记必选参数,避免运行时错误
Flaggy通过其简洁的API和强大的功能,成为了Go语言中处理命令行参数的一个优秀选择,特别适合需要子命令支持的复杂CLI应用程序。