我尝试实现自己的CLI,并希望使用picocli来解析命令的参数。这就是为什么我根本不希望picocli在控制台中编写。因此,我创建了带有某些选项和参数注释的MyCommand类。现在,我希望能够执行以下操作:

val myCommand = CommandLine.populateCommand(MyCommand(), args)
myCommand.execute();
val output = myCommand.getOutput();
val errors: List<String> = myCommand.getErrors();

前三行没有问题,但是我不确定如何处理第四行。现在populateCommand只会抛出所有异常,而捕获它们不是一个选择,因为抛出的异常将停止我的管道计算。 Picocli文档建议使用解析器宽松模式将异常存储在ParseResult中,但这意味着我必须使用难以满足自己需求的commandLine.parseWithHandlers方法。
我想念什么吗?也许我仍然可以使用populateCommand并将异常存储在某个地方?
这是populateCommand引发的异常之一的堆栈跟踪:
Exception in thread "main" picocli.CommandLine$MissingParameterException: Missing required parameter for option '-A' (<afterContext>)
    at picocli.CommandLine$Interpreter.assertNoMissingParameters(CommandLine.java:8059)
    at picocli.CommandLine$Interpreter.applyOption(CommandLine.java:7534)
    at picocli.CommandLine$Interpreter.processStandaloneOption(CommandLine.java:7446)
    at picocli.CommandLine$Interpreter.processArguments(CommandLine.java:7355)
    at picocli.CommandLine$Interpreter.parse(CommandLine.java:7226)
    at picocli.CommandLine$Interpreter.parse(CommandLine.java:7116)
    at picocli.CommandLine.parse(CommandLine.java:824)
    at picocli.CommandLine.populateCommand(CommandLine.java:777)

最佳答案



一种想法是使用parseArgs方法而不是populateCommand方法。如果您已将解析器配置为宽松的,则此方法返回 ParseResult ,从中您可以获取picocli在解析过程中遇到的错误。

例如:

val myCommand = MyCommand();
val commandLine = CommandLine(myCommand);

// tell parser to be lenient
commandLine.getCommandSpec().parser().collectErrors(true);

// parse user input, query result for errors
val parseResult = commandLine.parseArgs(args);
val parseErrors: List<Exception> = parseResult.errors();

// ignoring the errors for now...
myCommand.execute();
val output = myCommand.getOutput();
val appErrors: List<String> = myCommand.getErrors();



提示:如果要创建自己的交互式CLI控制台(而不是单个命令),则可能对JLine 2(需要Java 5或更高版本)或JLine 3(需要Java 8或更高版本)感兴趣。 Picocli提供了picocli-shell-jline2picocli-shell-jline3模块,这些模块的PicocliJLineCompleter显示了picocli命令的上下文相关完成候选对象。 (每个模块的自述文件都有一个示例。)使用picocli定义其命令的应用程序不再需要为其命令和选项手动编写“完成程序”。 (Micronaut CLI中使用了它的早期版本。)

10-07 13:50