私は自分のCLIを実装しようと私のコマンドの引数を解析するためpicocliを使用したいです。私はすべてのコンソールに書き込みにpicocliをしたくない理由です。だから私は、クラスを作成しMyCommand
、いくつかのオプションやパラメータの注釈とともに。今、私はこのような何かを行うことができるようにしたいです:
val myCommand = CommandLine.populateCommand(MyCommand(), args)
myCommand.execute();
val output = myCommand.getOutput();
val errors: List<String> = myCommand.getErrors();
そこ最初の3行には問題ありませんが、私は第四に対処する方法がわかりません。今、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コマンドの終了候補を。(各モジュールのREADME例を有する。)使用picocliは、それらのコマンドおよびオプションのハンドコード終了者にそのコマンドを不要に定義することアプリケーション。(これの初期のバージョンがで使用されているMicronaut CLI。)