2011-10-12 101 views
7

我知道这个问题在这里和其他地方被问过很多次,因为我正在寻找答案。然而,它仍令我困惑,为什么命令行解析器库不提供这种常见的使用场景,我有一组子命令,每个子命令都有自己的一组必需和可选参数。类似的构造可以在git/svn中找到,但是在他们的情况下,如果我没有弄错,子命令是独立的程序。命令行分析器和缺少子命令和分组?

总之,我所寻求的是一种简单的方法:

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

在Java的世界里,两人经常提到的库是Apache的命令CLI和司法制度评估方案。我没有看到他们中的任何一位有这样的想法 - 虽然你可能会调整和定制很多以适应......但是定义一个选项的基本流程,注册......然后在最后解析它们都不会“如果考虑到不同子命令的情况,验证和解析器需要以不同的方式运行。

也许这里的常识是这个应用程序太具体,应该留给应用程序本身处理。我可以想到的一种方法是定义一个BaseCommand类,并且每个子命令都会扩展它并注册它们自己......以便将其分解以便于管理。如果任何成熟的框架可以做到这一点,我会欣赏任何指针在这里。

虽然我对当前解析器功能的理解可能是错误的,但非常感谢您的任何洞察。

奥利弗

回答

6

嗨只是看看到jcommander这正是支持所描述的场景。 您提到Commons CLI在版本1.X中是正确的,但是CLI2的开发也支持这一点,但不幸的是,这个版本从未发布过。

+0

我不知道我错过了这个图书馆,但它看起来很有趣。谢谢。 – Oliver

0

看一看cli-parsec。它的特点(除其他外)正是我相信你想要的:-) https://github.com/dr1fter/cli-parsec

它的功能任意嵌套的子命令(子命令可能有子命令等)。每个子命令都可以定义选项。一个简单的例子在这里给出(2子命令与单个选项): https://github.com/dr1fter/cli-parsec/wiki/Example

Maven的片段:

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

基于您的链接的域名/ URL与您的用户名相同或包含您的用户名,您似乎已链接到您自己的网站。如果你这样做,你需要透露它是你的网站。如果您不透露它是您自己的网站,则通常将其视为垃圾邮件。请参阅:[**什么意思是“良好”的自我推销?](// meta.stackexchange.com/q/182212)和[如何不成为垃圾邮件制造者](http://stackoverflow.com/help/promotion )。 – Makyen

1

picocli支持嵌套子命令到任意深度。

主命令定义全局选项,每个嵌套命令的级别都可以添加仅适用于该级别的选项。

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

您可能还喜欢它对ANSI样式和颜色的使用帮助。

请注意,除了选项和位置参数外,使用帮助还列出了注册的子命令。

enter image description here

的使用帮助,很容易与注释定制。

enter image description here

  • 基于注解
  • 混帐风格子
  • 嵌套子子
  • 强类型选项参数
  • 强类型的位置参数
  • 自定义类型转换
  • 多值选项
  • 一个字段有多少争论消耗
  • 流利的API
  • POSIX风格的集群短选项
  • GNU风格的长选项
  • 直观的模型允许任何选项前缀
  • ANSI颜色使用帮助
  • 可自定义使用帮助
  • 单一源文件:包含源代码以保持您的应用程序单个罐子