2016-08-08 8 views
1

のように私のアプリのためのコマンドがあるかもしれないゴーフラグを使用して:グローバルパラメータ私はこのライブラリ<a href="https://github.com/jessevdk/go-flags" rel="nofollow">https://github.com/jessevdk/go-flags</a></p> <p>を使用してい

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の代わりにそれぞれの低レベルのコマンドを追加して自分自身を繰り返すようです。前もって感謝します!

答えて

2

NewParserを使用すると、新しいパーサーを作成できます。ドキュメントから、最初の引数は "アプリケーションオプション"になる構造体へのポインタであることがわかります。私は説明から始め、実際の例に従います。そのような前に述べたようにあなたは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"` 
} 

:あなたはあなたのアプリケーション全体のオプションが含まれている以下の構造体を持っているふり

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

あなたの追加コマンドは、パーサを追加することができます.AddCommand関数。例:

list := ListCommand{} 
parser.AddCommand("list", "lists something", "", &list) 

parserを呼び出して終了します。パースして楽しむ!

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を使用する場合は、次のコード例では、私は冗長と簡潔なフラグを提供することができます:

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のVerboseまたはTerseフラグにどのようにアクセスすればよいですか? ListCommandのExecute関数は 'func(c * ListCommand)Execute(args [] string)error'を実行し、ListCommandはVerboseまたはTerse権限にアクセスできません。 – Crystal

+0

これは正しいです。私の例では、上記の例の 'defaultOptions'を通して冗長と簡潔にアクセスできます。プログラム全体でこれらのオプションにアクセスできるようにグローバルにすることができます。 –

+0

私はあなたが達成しようとしていることを達成する別の可能性で私の答えを編集するつもりです。ちょっと待ってください。 –

関連する問題

 関連する問題