1

我使用 PicoCLI 来解析参数。我需要指定setStopAtPositional(true)其中一个子命令。有没有办法通过注释来做到这一点?目前我这样做:

cmd.getSubcommands().get("submit").setStopAtPositional(true);

但是最好在指定提交命令的方法中指定它以将整个规范集中在一个地方。

我的班级有这样的结构:

@Command(...)
public class CommandLine implements Callable<Void> {

    @Command(...)
    public void submit( ... options) {
    }
}
4

1 回答 1

1

Picocli 允许为每个子命令配置不同的解析器,并且您的建议适用于您的示例。

目前没有注释 API 来配置解析器,在未来的版本中添加它可能是一个想法。

请注意,通过CommandLine对象设置解析器配置将更改该命令及其子命令和子子命令的完整层次结构。

如果要更改单个命令的解析器配置(不影响其子命令),请使用CommandLine.getCommandSpec().parser()获取其ParserSpec对象并对该对象进行配置ParserSpec(示例如下)。

问题没有提到这一点,但可能有人担心在 picocli 3.9.x 中使用parseWithHandler方法在配置后调用程序有点笨拙。execute使用picocli 4.0 中添加的方法,这会变得更好一些。

例如:

@Command(subcommands = B.class)
class A implements Callable<Integer> {
}

@Command(name = "B")
class B implements Callable<Integer> {

    @Command
    public int subB(... options) {
    }
}

public static void main(String... args) {
    CommandLine cmdA = new CommandLine(new A());

    // Example 1: configure the B command _and_ its subcommands
    cmdA.getSubcommands().get("B").setStopAtPositional(true);

    // Example 2: configure the A command _only_ (not the subcommands)
    cmdA.getCommandSpec().parser().caseInsensitiveEnumValuesAllowed(true);

    // parse input and run the command
    int exitCode = cmdA.execute(args);
    System.exit(exitCode);
}
于 2019-05-24T05:31:08.920 回答