我该如何处理在picocli错误?

Okumo:

我试图实现自己的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)
REMKO克劳森:

忽略解析错误是不寻常的,但创建自己的时候可能是有用的互动 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方法需要格外强劲的处理部分初始化选项/位置参数。

提示:如果您正在创建自己的交互式 CLI控制台(而不是单个命令),您可能会感兴趣的JLine 2(需要Java 5或更高版本)或的JLine 3(需要Java 8或更高版本)。Picocli提供picocli壳jline2picocli壳jline3具有模块PicocliJLineCompleter即显示上下文敏感的完成候选picocli命令。(每个模块的自述具有一个例子。)应用在使用picocli来定义它们的命令不再需要手工代码完成者为他们的命令和选项。(这方面的一个早期的版本是在使用Micronaut CLI)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章