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

标签 go

我正在使用这个库 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/

相关文章:

google-app-engine - 如何在运行 AppEngine 的 Go 服务器生成的响应中设置 HTTP header ?

go - 在 Go 中读取命令的结果

go - 初始化第三方库的一部分结构

go - undefined main - 测试代码无法访问主包

select - Go Golang select 语句无法接收发送的值

go - Go 的 net.Listener Addr() 有什么用?

go - 如何将两个 json 值解码到同一个变量中?

go - JSON 对我来说比 Protobuf/gRPC 快得多,Go 作为服务器,PHP 作为客户端

pointers - 调用结构属性方法时 Golang 结构指针引用丢失

go - 为什么 byte cast 炸毁不一致的 golang?