我试图实现自己的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)
忽略解析错误是不寻常的,但创建自己的时候可能是有用的互动 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壳jline2和picocli壳jline3具有模块PicocliJLineCompleter
即显示上下文敏感的完成候选picocli命令。(每个模块的自述具有一个例子。)应用在使用picocli来定义它们的命令不再需要手工代码完成者为他们的命令和选项。(这方面的一个早期的版本是在使用Micronaut CLI)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句