命令行解析器和缺少子命令和分组?

时间:2011-10-12 11:16:46

标签: java picocli

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

总结一下,我正在寻找的是一种简单的方法:

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

在java的世界中,两个经常提到的库是Apache Command CLI和JSAP。我没有看到他们中的任何一个都考虑到这一点 - 虽然你可能会调整和定制很多东西以适应......但是定义一个选项的基本流程,注册......然后在最后,解析它们都没有'为了考虑使用不同子命令的情况,验证和解析器需要以不同的方式运行。

这里的常识可能是这个应用程序非常具体,应该留给应用程序本身来处理。我能想到的一种方法是定义一个BaseCommand类,每个子命令扩展它并自己注册......作为一种分解它以便于管理的方法。如果任何成熟的框架可以做到这一点,我会感激任何指针。

我对当前解析器功能的理解可能是错的,但是我们非常感激任何见解。

4 个答案:

答案 0 :(得分:6)

您只需查看完全支持所描述方案的jcommander即可。 您提到了Commons CLI,它在版本1.X中是正确的,但是CLI2也存在支持它的开发,但遗憾的是这个版本从未发布过。

另一个好的解决方案是https://picocli.info/

答案 1 :(得分:2)

Args4j现在支持subcommands(从版本2.0.23开始或附近)。

答案 2 :(得分:2)

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

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

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

  • 注释基于
  • git-style子命令
  • 嵌套的子子命令
  • 强类型选项参数
  • 强类型位置参数
  • 可自定义类型转换
  • 多值选项
  • 字段消耗的参数的直观模型
  • 流畅的API
  • POSIX风格的群集短选项
  • GNU样式长选项
  • 允许任何选项前缀
  • 使用中的ANSI颜色帮助
  • 可自定义的使用帮助
  • 单个源文件:包含作为源,以使您的应用程序保持单个jar

答案 3 :(得分:0)

看看cli-parsec。它(以及其他东西)正是我认为你想要的东西:-) https://github.com/dr1fter/cli-parsec

它具有子命令的任意嵌套(子命令可以有子命令等)。每个子命令可以定义选项。这里给出一个简单的例子(两个带有各个选项的子命令): 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>