picocli - PicoCLI : 使用部分中的选项顺序
问题描述
我已将命令的 sortOptions 设置为 false,但我仍然在“用法”部分中看到命令的选项按排序顺序排列。我想看看他们的申报顺序。
示例代码
@Command(name = "application", subcommands = { AddSubCommand.class })
public class Sample implements Runnable {
@Spec CommandSpec spec;
@Override
public void run() {
throw new ParameterException(spec.commandLine(), "Specify a subcommand");
}
public static void main(String... args) {
new CommandLine(new Sample()).execute("add", "-h");
}
}
@Command(name = "add", sortOptions = false)
class AddSubCommand implements Runnable {
@Option(names = { "-h" }, usageHelp = true, hidden = true)
boolean helpFlag;
@Option(names = { "-i" }, required = true, description = "id")
int id;
@Option(names = { "-t" }, required = true, description = "type")
String type;
@Option(names = { "-c" }, required = true, description = "config")
String config;
public void run() {
// logic
}
}
输出
Usage: application add -c=<config> -i=<id> -t=<type>
-i=<id> id
-t=<type> type
-c=<config> configuration
期待
Usage: application add -i=<id> -c=<config> -t=<type>
-i=<id> id
-t=<type> type
-c=<config> configuration
解决方案
您是正确的,选项在概要行中排序,无论是否sortOptions = false
指定。(sortOptions
注解属性只影响使用帮助消息的选项列表部分的顺序,而不影响概要。)
可以自定义概要,但不能使用注释 API;您将需要使用编程 API。
Sample
将类方法更改main
为以下内容:
public static void main(String... args) {
new CommandLine(new Sample())
.setHelpFactory(new UnsortedSynopsisHelpFactory())
.execute("add", "-h");
}
并添加以下UnsortedSynopsisHelpFactory
类:
class UnsortedSynopsisHelpFactory implements CommandLine.IHelpFactory {
@Override
public CommandLine.Help create(CommandSpec commandSpec, ColorScheme colorScheme) {
return new CommandLine.Help(commandSpec, colorScheme) {
@Override
protected Ansi.Text createDetailedSynopsisOptionsText(
Collection<ArgSpec> done,
Comparator<OptionSpec> optionSort,
boolean clusterBooleanOptions) {
return super.createDetailedSynopsisOptionsText(
done,
null, // do not sort options in synopsis
clusterBooleanOptions);
}
};
}
}
这将给出以下输出:
Usage: application add -i=<id> -t=<type> -c=<config>
-i=<id> id
-t=<type> type
-c=<config> config
谢谢你提出这个!我在模块中添加了一个示例Unsorted.java 。picocli-examples