我尝试实现自己的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)
答案 0 :(得分:1)
忽略解析错误是不常见的,但在创建时会很有用 您自己的 interactive CLI控制台,而不是单个命令。我的答案假设这就是您的想法。
一个想法是使用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();
请注意,如果存在 个解析错误,则表示用户 指定的无效输入。结果,您的命令可能没有被执行 正确初始化。
execute
方法必须特别健壮 处理部分初始化的选项/位置参数。
提示:如果要创建自己的 interactive CLI控制台(而不是单个命令),则可能对JLine 2(需要Java 5或更高版本)或{{ 3}}(需要Java 8或更高版本)。 Picocli提供了JLine 3和picocli-shell-jline2模块,这些模块具有PicocliJLineCompleter
,这些模块显示了picocli命令的上下文相关完成候选。 (每个模块的自述文件都有一个示例。)使用picocli定义其命令的应用程序不再需要为其命令和选项手动编写“完成程序”。 (picocli-shell-jline3中使用了此版本的早期版本。)