我尝试实现自己的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)发布于 2019-02-06 23:24:18
忽略解析错误是不寻常的,但是在创建您自己的交互式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 (需要Java5或更高版本)或JLine 3 (需要Java8或更高版本)感兴趣。Picocli提供了picocli-shell-jline2 2和picocli-shell-jline3 3模块,这些模块具有一个PicocliJLineCompleter,该模块可以显示针对picocli命令的上下文敏感的完成选择。(每个模块的自述文件都有一个示例。)使用picocli定义命令的应用程序不再需要为命令和选项编写Completer代码。(在微型CLI中使用的是早期版本。)
https://stackoverflow.com/questions/54544936
复制相似问题