Riga di comando Parser con escludono i parametri richiesti

Ho cominciato a usare il Riga Di Comando Parser Biblioteca di uno strumento che avrà sia una interfaccia a riga di comando di esecuzione. Lanciare la GUI è fatto tramite un’opzione della riga di comando.

Vorrei, pertanto, hanno richiesto opzioni nel caso in cui il programma è in esecuzione in modalità riga di comando. In sostanza, vorrei che l’Opzione 1 e l’Opzione 2 per essere richiesto se l’opzione “Gui” non è impostato.

Ho cercato di coniugare il MutuallyExclusiveSet e gli attributi Necessari, come mostrato di seguito, ma non funziona come pensavo. Non mi fraintendere il concetto di “MutuallyExclusiveSet” o semplicemente abusando di esso? O è qualcosa che la libreria non è ancora sostenere?

public class CommandLineOptions : CommandLineOptionsBase
{
    [Option(null, "gui", Required = false, HelpText = "Launch the GUI", MutuallyExclusiveSet = "Gui")]
    public bool Gui { get; set; }

    [Option(null, "opt1", HelpText = "Option 1", MutuallyExclusiveSet = "CommandLine", Required = true)]
    public string Option1 { get; set; }

    [Option(null, "opt2", HelpText = "Option 2", MutuallyExclusiveSet = "CommandLine", Required = true)]
    public string Option2 { get; set; }
}
  • Come ha fatto un lavoro rispetto a quanto previsto, qual è stato il comportamento effettivo?
  • La biblioteca impossibile analizzare argomenti se io solo pass “gui” con un errore che indica che “opt1” è richiesto. Mi aspetterei che funziona come “gui” è diverso da MutuallyExclusiveSet.
InformationsquelleAutor Julien Jacobs | 2012-05-17



One Reply
  1. 41

    Tutte le opzioni che appartiene a una escludono a vicenda set si escludono a vicenda tra di loro.
    Seguire questo esempio:

    class Options {
      [Option("a", null, MutuallyExclusiveSet="zero")] 
      public string OptionA { get; set; }
      [Option("b", null, MutuallyExclusiveSet="zero")] 
      public string OptionB { get; set; }
      [Option("c", null, MutuallyExclusiveSet="one")] 
      public string OptionC { get; set; }
      [Option("d", null, MutuallyExclusiveSet="one")] 
      public string OptionD { get; set; }
    }

    Con queste regole seguenti righe di comando sono validi:

    $ app -a foo -c bar
    $ app -a foo -d bar
    $ app -b foo -c bar
    $ app -b foo -d bar

    e questi non sono:

    $ app -a foo -b bar
    $ app -c foo -d bar
    $ app -a foo -b bar -c foo1 -d foo2

    Come si può vedere non è possibile specificare le opzioni che appartengono allo stesso insieme. Ricordate anche che precompilati singleton (CommandLineParser.Di Default) non funzionano con MutualliyExclusiveSet attributo. Avete bisogno di vestire un parser da soli:

    if (new CommandLineParser(new CommandLineParserSettings {
                                MutuallyExclusive = true,
                                CaseSensitive = true,
                                HelpWriter = Console.Error}).ParseArguments(args, opts) {
      //consume values here
      Console.WriteLine(opts.OptionA);
    }

    Questo è il modo in cui escludono a vicenda opzioni nella Riga di Comando Parser Biblioteca. Comunque per risolvere il tuo problema specifico, ti consiglio di definire tutte le opzioni, come si farebbe in una normale applicazione console. Quindi aggiungere il Gui interruttore boolean. Se si specifica questa opzione ignora gli altri. Se non si comporta come una normale applicazione console.

    (Un’altra cosa: nella versione successiva sarà una funzione chiamata “secondarie” che vi permetterà di gestire più tipi di Opzioni; questo forse il caso giusto per la prossima funzione.)

    MODIFICA 2015-08-30:

    Le funzionalità implementate in 1.9.x stabile sempre creato confusione, è stata disattivata per impostazione predefinita e richiesto agli sviluppatori di attivarlo tramite le impostazioni dell’istanza.

    Versione 2.0.x, dove il kernel è stato completamente riscritto, la funzione è sempre attiva e cercherò di mostrare un semplice esempio (ricordo che l’API pubblica è cambiato dalla versione 2.0.x è una major release di aggiornamento).

    
    class Options {
      [Option(SetName = "web")]
      public string WebUrl { get; set; }
      [Option(SetName = "web")]
      public int MaxLinks { get; set; }
    
      [Option(SetName = "ftp")]
      public string FtpUrl { get; set; }
      [Option(SetName = "ftp")]
      public int MaxFiles { get; set; }
    
      [Option]
      public bool Verbose { get; set; }
    }

    Set da ftp insieme non sono compatibili con quelli web, --verbose (che non appartiene ad un insieme, o meglio appartiene a quella di default "" è neutro e può essere usato a piacimento).
    Valido:

    
    $ app --weburl http://stackoverflow.com --maxlinks 99
    $ app --ftpurl ftp://ftp.myoffice.files.com --maxfiles 1234
    $ app --verbose --weburl http://twitter.com --maxlinks 777
    $ app --ftpurl ftp://ftp.xyz.org --maxfiles 44 --verbose
    $ app --verbose

    Non valido:

    
    $ app --weburl http://stackoverflow.com --maxlinks 99 --ftpurl ftp://ftp.xyz.org
    $ app --ftpurl ftp://ftp.myoffice.files.com --maxfiles 1234 --maxlinks 777
    $ app --verbose --weburl http://twitter.com --maxfiles 44
    $ app --maxfiles 44 --maxlinks 99
    • La ringrazio molto per la risposta dettagliata! Ho avuto la sensazione che ho frainteso il concetto…ho finito aggiunta di un Convalidare funzione per le mie opzioni di classe per controllare gli argomenti. Che farà il trucco fino a quando una caratteristica futuro, potenzialmente, gli indirizzi di questo caso.
    • Questo è l’esatto opposto di come wiki dice che funziona, ma è come sembra funzionare.
    • È possibile utilizzare la riga di comando parser per richiedere che uno ed uno solo -a o -b è specificato. Adesso sembra che il comportamento richiede non più di una di -a o -b.
    • Fino a 2.0.* divenne stable (ora è beta) c’è una sezione specifica del wiki dedicato alla nuova release: github.com/gsscoder/commandline/wiki/Latest-Version. Quando divenne stabile il tutto verrà aggiornato.
    • il tuo post ancora non spiega (almeno per me) come utilizzare una combinazione di Required e SetName.
    • da 2.0: le cose sono più semplici. Opzioni con lo stesso nome del set possono essere specificati insieme, se si include un altro collegato all’altro nome per il set di analisi avrà esito negativo.
    • Grazie per la tua risposta. Tuttavia, anche con la versione 2.x, il problema è che non si può avere un Required opzione insieme con un SetName. Diciamo che ho un FooSet e un BarSet. Ora ogni volta che FooOption è utilizzato, voglio obbligatorio rispettare che SecondFooOption è utilizzato da decorare con Required. Ora non posso utilizzare BarSet opzioni più (anche quando non FooSet opzione viene utilizzata), in quanto l’analisi non riesce a causa di SecondFooOption essere decorati come Required.
    • Attaccata al tuo esempio di cui sopra, diciamo che abbiamo avuto boolean UseWebMode (SetName = "web") e UseFtpMode (SetName = "ftp") parametri. Ora, SE, e solo SE, UseWebMode è obbligatorio fornire il WebUrl parametro. Come posso fare questo?
    • si prega di essere pazienti, puoi riformulare la domanda?
    • È stato un po ‘ lo so, ma ti ricordi come è stato implementato che Validate() funzione? E come le hai per passare un fallimento per il parser?
    • Ho appena iniziato con questo, ma la prima ipotesi per risolvere il vostro web/ftp problema potrebbe essere quello di usare i verbi. In questo modo: github.com/gsscoder/commandline/wiki/Verb-Commands
    • Come posso implementare una funzione di convalida per gli argomenti? E come posso farlo passare un fallimento per il parser?
    • Ho semplicemente aggiunto un pubblico metodo Validate per la mia CommandLineOptions (che eredita da CommandLineOptionsBase) in cui stavo testando i valori dei parametri a seconda delle mie esigenze (cioè if "gui" is not set then check that opt1 and opt2 are set) In app mi è stato semplicemente chiamare il mio Convalidare funzione oltre a ParseArguments. Qualcosa di simile if (parser.ParseArguments(args, options) && options.Validate())
    • le opzioni.Validate() senso, grazie 🙂

Lascia un commento