【问题标题】:Command Line parser and lack of subcommand and grouping?命令行解析器和缺少子命令和分组?
【发布时间】:2021-03-28 01:54:28
【问题描述】:

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

总而言之,我正在寻找一种简单的方法:

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

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

也许这里的普遍看法是,这太特定于应用程序,应该留给应用程序本身来处理。我能想到的一种方法是定义一个 BaseCommand 类,每个子命令扩展它并注册它们自己......作为一种分解它以便于管理的方法。如果有任何成熟的框架可以做到这一点,我将不胜感激。

不过,我对当前解析器功能的理解可能是错误的,非常感谢任何见解。

【问题讨论】:

标签: java


【解决方案1】:

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

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

【讨论】:

  • 我不知道我是怎么错过这个库的,但它看起来很有趣。谢谢。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    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 样式和颜色的使用帮助。

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

    使用注释可以轻松自定义使用帮助。

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

    【讨论】:

      【解决方案4】:

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

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

      Maven sn-p:

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

      【讨论】:

      • 根据您的链接的域/URL 与您的用户名相同或包含您的用户名,您似乎已链接到您自己的网站。如果您这样做,您需要披露它是您的网站。如果您不透露它是您自己的网站,它通常被视为垃圾邮件。请参阅:What signifies "Good" self promotion?How to not be a spammer
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 2021-06-11
      相关资源
      最近更新 更多