2011-10-12 9 views
7

So che questa domanda è stata posta molte volte qui e altrove prima mentre sto cercando la risposta. Tuttavia, mi imbarazza ancora il motivo per cui la libreria del parser della riga di comando non fornisce questo scenario di utilizzo comune, dove ho un gruppo di sottocomandi, ogni sottocomando ha il proprio insieme di argomenti obbligatori e facoltativi. Costrutto simile può essere trovato in git/svn, anche se, nel loro caso, il comando sottocomando è un programma standalone se non sbaglio.parser della riga di comando e mancanza di sottocomando e raggruppamento?

In sintesi, quello che sto cercando è un modo semplice per:

top_command subcmd_A [ command A's options ....] 
top_command subcmd_B [ command B's options ....] 
... 

Nel mondo di Java, due biblioteca spesso citati sono Apache Comando CLI e JSAP. Non vedo che nessuno di loro ha questo in mente - anche se probabilmente si potrebbe modificare e personalizzare molto per adattarsi ... ma il flusso di base di definire un'opzione, registrarsi ... quindi alla fine, analizzarli tutti non lo fa Considerato il caso con diversi sottocomandi, la convalida e il parser devono comportarsi in modo diverso.

Forse la saggezza comune qui è che questo è troppo specifico per l'applicazione e dovrebbe essere lasciato all'applicazione stessa da gestire. Un modo in cui posso pensare è definire una classe BaseCommand, e ogni sottocomando lo estende e si registra da solo ... come modo per suddividerlo in una gestione facile. Se qualche framework maturo può farlo, apprezzerei qualsiasi puntatore qui.

Potrei sbagliarmi sulla mia comprensione dell'attuale capacità del parser, tuttavia, qualsiasi intuizione è molto apprezzata.

Oliver

risposta

6

Hi basta dare un'occhiata in jcommander che sostiene esattamente lo scenario descritto. Hai menzionato Commons CLI che è vero nelle versioni 1.X ma esiste uno sviluppo per CLI2 che supporta anche questo, ma sfortunatamente questa versione non è mai stata pubblicata.

+0

Non so come mi sia sfuggita questa libreria, ma sembra interessante. grazie. – Oliver

0

Dai un'occhiata allo cli-parsec. Presenta (tra le altre cose) esattamente quello che credo tu voglia :-) https://github.com/dr1fter/cli-parsec

È dotato di nidificazione arbitraria di sottocomandi (i sottocomandi possono avere sottocomandi e così via). Ogni comando secondario può definire opzioni. Un semplice esempio è dato qui (due sottocomandi con singole opzioni): https://github.com/dr1fter/cli-parsec/wiki/Example

Maven frammento:

<dependency> 
    <groupId>de.dr1fter</groupId> 
    <artifactId>de.dr1fter.cli-parsec> 
    <version>0.2.1</version> 
</dependency> 
+0

In base al dominio/URL del tuo link (s) che sono uguali o contenenti il ​​tuo nome utente, sembra che tu abbia collegato al tuo sito. Se lo fai, devi rivelare che è il tuo sito. Se non comunichi che si tratta di un tuo sito, è spesso considerato spam. Vedi: [** Cosa significa "Buono" auto-promozione? **] (// meta.stackexchange.com/q/182212) e [Come non essere uno spammer] (http://stackoverflow.com/help/promotion). – Makyen

1

picocli supporta subcommands nidificate a profondità arbitraria.

Il comando principale definisce le opzioni globali, ogni livello successivo di comandi nidificati può aggiungere opzioni che si applicano solo a quel livello.

CommandLine commandLine = new CommandLine(new MainCommand()) 
     .addSubcommand("cmd1", new ChildCommand1()) // 1st level 
     .addSubcommand("cmd2", new ChildCommand2()) 
     .addSubcommand("cmd3", new CommandLine(new ChildCommand3()) // 2nd level 
       .addSubcommand("cmd3sub1", new GrandChild3Command1()) 
       .addSubcommand("cmd3sub2", new GrandChild3Command2()) 
       .addSubcommand("cmd3sub3", new CommandLine(new GrandChild3Command3()) // 3rd 
         .addSubcommand("cmd3sub3sub1", new GreatGrandChild3Command3_1()) 
         .addSubcommand("cmd3sub3sub2", new GreatGrandChild3Command3_2()) 
           // etc 
       ) 
     ); 

Potrebbe piacerti anche il suo utilizzo come aiuto con stili e colori ANSI.

Si noti che la guida all'utilizzo elenca i sottocomandi registrati oltre alle opzioni e ai parametri posizionali.

enter image description here

L'aiuto utilizzo è facilmente personalizzabile con annotazioni.

enter image description here

  • annotazione basata
  • sottocomandi git in stile
  • annidati sotto-sottocomandi
  • opzione parametri fortemente tipizzati
  • fortemente tipizzati parametri posizionali
  • tipo di conversione personalizzabile
  • opzioni multi-valore
  • modello intuitivo per quanti argomenti un campo consuma
  • API fluente
  • POSIX-style cluster opzioni brevi
  • opzioni lunghe
  • stile GNU
  • permette qualsiasi prefisso opzione
  • colori ANSI in help d'uso
  • aiuto d'uso personalizzabile
  • unico file sorgente: include come sorgente per mantenere l'applicazione un singolo jar
Problemi correlati