2 votes

Comment regrouper des sous-commandes à l'aide du paquet go_flags ?

J'utilise https://github.com/jessevdk/go-flags et tente de regrouper les sous-commandes en utilisant l'option de premier niveau "group" dans le champ struct. Mais au lieu de regrouper les sous-commandes, il regroupe en fait les options dans les sous-commandes. Voici mon code :

type Cmd1 struct {
    Opt1         string `long:"opt1" description:"first opt" required:"true"`
    Opt2         int    `long:"opt2" description:"second opt" default:"10"`
}

type Cmd2 struct {
    OptA string `long:"optA" description:"opt a" default:":8080"`
    OptB string `long:"optB" description:"opt b" default:"debug"`
}

type MainCmd struct {
    Cmd1      Cmd1      `group:"group1" namespace:"group1" env-namespace:"group1"`
    Cmd2     Cmd2     `group:"group2" namespace:"group2" env-namespace:"group2"`
}

func main() {
    var mainCmd MainCmd
    parser := flags.NewParser(&mainCmd, flags.Default) 
    if _, err := parser.Parse(); err != nil {
        if err, ok := err.(*flags.Error); ok {
            if err.Type == flags.ErrHelp {
                os.Exit(0)
            }
            parser.WriteHelp(os.Stdout)
        }
        os.Exit(1)
    }
}

Ce que je recherche, c'est que lorsque j'exécute la fonction principale, elle imprime le message d'aide avec les sous-commandes groupées, par exemple :

groupe1 :

--Cmd1

groupe2 :

--Cmd2

Cependant il regroupe les options des sous-commandes comme :

groupe1 :

--groupe1.opt1=

--groupe1.opt2=

groupe2 :

--groupe2.optA=

--groupe2.optB=

Des idées ou de l'aide ? Merci !

0voto

natade Points 1

Vous pouvez utiliser la fonction AddCommand et pourrait également séparer le paquet groupe1 et groupe2 pour le rendre bien classifié.

Code :

package main

import (
    "fmt"
    "os"

    "github.com/jessevdk/go-flags"
)

// package group 1
type Group1 struct {
    Opt1 string `long:"opt1" description:"first opt" required:"true"`
    Opt2 int    `long:"opt2" description:"second opt" default:"10"`
}

var group1Command Group1
var group1 = "group1"

func (g *Group1) Execute(args []string) error {
    fmt.Printf("Option (opt1=%v, opt2=%v): \n", g.Opt1, g.Opt2)
    return nil
}

// package group 2
type Group2 struct {
    OptA string `long:"optA" description:"opt a" default:":8080"`
    OptB string `long:"optB" description:"opt b" default:"debug"`
}

var group2Command Group2
var group2 = "group2"

func (g *Group2) Execute(args []string) error {
    fmt.Printf("Option (opt1=%v, opt2=%v): \n", g.OptA, g.OptB)
    return nil
}

var parser = flags.NewParser(nil, flags.Default)

func init() {
    parser.AddCommand(group1,
        "Group 1 summary",
        "Long description of group 1",
        &group1Command)

    parser.AddCommand(group2,
        "Group 2 summary",
        "Long description of group 2",
        &group2Command)
}

func main() {
    if _, err := parser.Parse(); err != nil {
        switch flagsErr := err.(type) {
        case flags.ErrorType:
            if flagsErr == flags.ErrHelp {
                os.Exit(0)
            }
            os.Exit(1)
        default:
            os.Exit(1)
        }
    }
}

Résultat enter image description here

Autres lectures

Docs

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X