使用go-flags的命令的全局参数

时间:2016-08-08 15:57:58

标签: go

我正在使用此库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来重复自己。提前谢谢!

1 个答案:

答案 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()
}