我正在使用此库https://github.com/jessevdk/go-flags
我的应用程序的命令可能如下:
ex list events
所以我有我的包装命令
type ExCommand struct {
List list.ListCommand `command:"list" description:"list events" subcommands-optional:"true"`
}
列表命令
type ListCommand struct {
ExCommand ExCommand `command:"events" description:"list events"`
Config string `short:"c" long:"config" description:"config file" optional:"yes"`
}
前命令
type EventsCommand struct {
}
func (c *ListCommand) Execute(args []string) error {
fmt.Println("execute list")
for _, val := range args {
fmt.Println(val)
}
fmt.Printf("c: %s\n", c.Config)
return nil
}
func (c *ExCommand) Execute(args []string) error {
fmt.Println("list events")
for _, val := range args {
fmt.Println(val)
}
return nil
}
所以我想做的是提供一些选项,比如
verbose
config
terse
是可以在任何命令上运行的全局选项。我似乎无法弄清楚是否有办法用这个库来做到这一点。有人有经验吗?我可以为每个单独的低级命令添加Config
,在这种情况下列出EventsCommand,但似乎我通过添加每个低级命令而不是更高级的ListCommand或ExCommand来重复自己。提前谢谢!
答案 0 :(得分:3)
您可以使用NewParser创建新的解析器。您将从文档中注意到,第一个参数是指向将成为“应用程序选项”的结构的指针。我将从解释开始,然后按照一个工作示例进行操作。假装您有以下包含应用程序范围选项的结构:
type Defaults struct {
Verbose []bool `short:"v" long:"verbose" description:"Show verbose debug information"`
Terse bool `short:"t" long:"terse" description:"Shows terse output"`
}
你可以像前面提到的那样将它传递给NewParser函数:
defaultOptions = Defaults{}
parser = flags.NewParser(&defaultOptions, flags.Default)
您可以使用parser.AddCommand函数添加其他命令。例如:
list := ListCommand{}
parser.AddCommand("list", "lists something", "", &list)
通过调用解析器完成。解析并享受!
parser.Parse()
fmt.Printf("Verbose: %v\n", defaultOptions.Verbose)
fmt.Printf("Terse: %v\n", defaultOptions.Terse)
这是一个完整的小例子:
package main
import (
"fmt"
flags "github.com/jessevdk/go-flags"
)
type Defaults struct {
Verbose []bool `short:"v" long:"verbose" description:"Show verbose debug information"`
Terse bool `short:"t" long:"terse" description:"Shows terse output"`
}
type ListCommand struct {
Config string `short:"c" long:"config" description:"config file" optional:"yes"`
}
func main() {
defaultOptions := Defaults{}
listCmd := ListCommand{}
parser := flags.NewParser(&defaultOptions, flags.Default)
parser.AddCommand("list", "lists something", "", &listCmd)
parser.Parse()
}
通过在命令结构中包含Defaults结构作为匿名结构,您也可以完全满足您的要求。注意我是如何引用ListCommand结构中的Defaults类型但是没有为该字段提供名称。这允许我访问Defaults的字段,就像它们是ListCommand结构的一部分一样。以下示例代码允许我在使用<prog> list -h
时提供详细和Terse标志:
package main
import flags "github.com/jessevdk/go-flags"
type Defaults struct {
Verbose []bool `short:"v" long:"verbose" description:"Show verbose debug information"`
Terse bool `short:"t" long:"terse" description:"Shows terse output"`
}
type ListCommand struct {
Config string `short:"c" long:"config" description:"config file" optional:"yes"`
Defaults
}
func main() {
listCmd := ListCommand{}
parser := flags.NewParser(nil, flags.Default)
parser.AddCommand("list", "lists something", "", &listCmd)
parser.Parse()
}