2011-10-12 2 views
7

Je sais que cette question a été posée plusieurs fois ici et ailleurs avant que je cherche la réponse. Cependant, il m'interroge encore pourquoi la bibliothèque de l'analyseur de ligne de commande ne fournit pas ce scénario d'utilisation commun, où j'ai un groupe de sous-commandes, chaque sous-commande a son propre ensemble d'arguments obligatoires et facultatifs. Une construction similaire peut être trouvée dans git/svn, bien que dans leur cas, la commande subcommand soit un programme autonome si je ne me trompe pas.Analyseur de ligne de commande et manque de sous-commande et de regroupement?

Pour résumer, ce que je cherche est un moyen facile de:

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

Dans le monde de Java, deux bibliothèques souvent cités sont Apache commandes CLI et JSAP. Je ne vois pas l'un ou l'autre d'entre eux en tête - bien que vous puissiez probablement ajuster et personnaliser beaucoup pour s'adapter ... mais le flux de base de la définition d'une option, enregistrer ... puis à la fin, les analyser tous doesn ' Vu que l'on considère le cas avec différentes sous-commandes, la validation et l'analyseur doivent se comporter différemment.

Peut-être la sagesse commune ici est que cela est trop spécifique à l'application et devrait être laissé à l'application elle-même à gérer. Une façon dont je peux penser est de définir une classe BaseCommand, et chaque sous-commande l'étend et s'enregistre ... comme un moyen de le décomposer pour une gestion facile. Si un cadre mature peut le faire, j'apprécierais n'importe quel pointeur ici. Je pourrais me tromper sur ma compréhension de la capacité de l'analyseur actuel, cependant, toute idée est très appréciée.

Oliver

Répondre

6

Salut il suffit de prendre un coup d'oeil dans jcommander qui soutient exactement le scénario décrit. Vous avez mentionné Commons CLI qui est vrai dans les versions 1.X mais il existe un développement pour CLI2 qui supporte cela aussi, mais malheureusement cette version n'a jamais été publiée.

+0

Je ne sais pas comment j'ai raté cette bibliothèque, mais ça a l'air intéressant. THX. – Oliver

0

Jetez un oeil à cli-parsec. Il comporte (entre autres choses) exactement ce que je crois que vous voulez :-) https://github.com/dr1fter/cli-parsec

Il comporte l'imbrication arbitraire des sous-commandes (les sous-commandes peuvent avoir des sous-commandes et ainsi de suite). Chaque sous-commande peut définir des options. Un exemple simple est donnée ici (deux sous-commandes avec des options individuelles): https://github.com/dr1fter/cli-parsec/wiki/Example

Maven Snippet:

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

Basé sur le domaine/URL de votre lien (s) étant le même que, ou contenant, votre nom d'utilisateur, vous semblez avoir lié à votre propre site. Si vous le faites, vous devez indiquer que c'est votre site. Si vous ne divulguez pas que c'est votre propre site, il est souvent considéré comme du spam. Voir: [** Qu'est-ce qui signifie "Bon" auto-promotion? **] (// meta.stackexchange.com/q/182212) et [Comment ne pas être un spammeur] (http://stackoverflow.com/help/promotion). – Makyen

1

picocli prend en charge les sous-commandes imbriquées à une profondeur arbitraire.

La commande principale définit les options globales, chaque niveau suivant de commandes imbriquées peut ajouter des options qui s'appliquent uniquement à ce niveau.

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 
       ) 
     ); 

Vous pouvez également aimer son aide d'utilisation avec les styles et les couleurs ANSI.

Notez que l'aide à l'utilisation répertorie les sous-commandes enregistrées en plus des options et paramètres de position.

enter image description here

L'aide d'utilisation est facilement personnalisée avec annotations.

enter image description here

  • annotation basée
  • sous-commandes de style git
  • sous-sous-commandes imbriquées
  • options fortement typé paramètres
  • paramètres de position fortement typé
  • conversion de type personnalisable
  • options multi-valeur
  • modèle intuitif pour combien d'arguments un champ consomme
  • API couramment
  • options courtes cluster style POSIX
  • de style GNU options longues
  • permet préfixe d'option
  • couleurs ANSI aide à l'utilisation
  • aide à l'utilisation personnalisable
  • fichier source unique: inclure comme source pour garder votre application un seul pot
Questions connexes