2016-08-08 17 views
1

我使用这个库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"` 
} 

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来重复自己。提前致谢!

回答

2

您可以使用NewParser来创建一个新的解析器。您会从文档中注意到第一个参数是一个指向结构的指针,该结构将是“应用程序选项”。我将从一个解释开始,并遵循一个工作示例。假设你有下面的结构包含应用程序范围的选项:可以用解析器添加

defaultOptions = Defaults{} 
parser = flags.NewParser(&defaultOptions, flags.Default) 

你额外的命令:

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功能这.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() 
} 

你也可以达到你正在通过包括默认结构为您的命令结构匿名结构询问究竟什么。注意我是如何在ListCommand结构中引用Defaults类型的,但没有提供该字段的名称。这允许我像访问ListCommand结构的一部分一样访问Defaults的字段。下面的示例代码允许我在使用<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() 
} 
+0

这是有道理的。但是,如何访问ListCommand中的详细或Terse标志? ListCommand的Execute函数运行'func(c * ListCommand)Execute(args [] string)error'并且ListCommand无法访问详细或Terse权限? – Crystal

+0

这是正确的。我的示例中的详细和简洁可以通过上面示例中的defaultOptions来访问。您可以使该全局能够在您的程序中访问这些选项。 –

+0

我要用另一种可能性来编辑我的答案,以达到您想要实现的目标。稍等一会儿。 –