我正在使用这个库 https://github.com/jessevdk/go-flags
我的应用程序的命令可能如下:
前列表事件
所以我有我的包装器命令
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"`
}
Ex命令
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 中添加。
最佳答案
您可以使用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 结构作为匿名结构包含在 Command 结构中来准确实现您的要求。请注意,我如何在 ListCommand 结构中引用默认类型,但没有提供该字段的名称。这允许我访问 Defaults 的字段,就好像它们是 ListCommand 结构的一部分一样。以下示例代码允许我在使用 <prog> list -h
时提供 Verbose 和 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()
}
关于go - 使用 go-flags 的命令的全局参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38833711/