picocli无参数自动显示帮助及合并子命令帮助的实现问题
问题1:无参数运行自动展示帮助文档
两种实现方案,推荐第一种注解方式,零业务代码侵入:
方案1:使用requiredSubcommand注解配置
直接在主类的@Command注解上添加requiredSubcommand = true属性,表示当前命令必须指定子命令才能执行,无参数/未传子命令时picocli会自动打印帮助文档,无需修改call方法逻辑:
@Command( subcommands = {C1.class, C2.class}, requiredSubcommand = true // 新增这一行 ) public class HelloCli implements Callable<Integer> { // 原有代码保持不变 }
运行无参数命令时会直接输出和-h参数完全一致的帮助内容,同时会提示缺少必填子命令的错误信息。
方案2:call方法手动触发打印
如果不需要强制子命令,仅想在无参数时默认返回帮助,可以在call方法中手动调用帮助打印接口:
@Override public Integer call() throws Exception { // 手动打印当前命令的帮助文档 new CommandLine(this).usage(System.out); return 1; }
问题2:输出包含所有子命令详情的全量帮助文档
picocli支持配置帮助打印的展示级别,只需要在打印帮助时指定展示所有子命令的详细信息即可,示例代码如下:
如果要让-h参数默认就打印全量帮助,可以在主类的@Command注解中配置usageHelp的展示规则:
@Command( subcommands = {C1.class, C2.class}, requiredSubcommand = true, showSubcommands = ShowSubcommands.ALWAYS // 新增配置,展示所有子命令详情 ) public class HelloCli implements Callable<Integer> { // 原有代码保持不变 }
如果需要单独触发全量帮助打印,也可以手动调用带配置的usage方法:
// 手动打印全量帮助,包含所有子命令的参数说明 CommandLine cmd = new CommandLine(new HelloCli()); cmd.setUsageHelpAutoWidth(true); cmd.usage(System.out, CommandLine.Help.Ansi.AUTO, CommandLine.Help.defaultColorScheme(), CommandLine.Help.Layout.createDefault(cmd.getCommandSpec()), CommandLine.Help.ShowSubcommands.ALL);
配置后打印的帮助文档会自动合并所有子命令的名称、别名、参数说明,无需分别调用各子命令的-h查看。
内容的提问来源于stack exchange,提问作者zappee
相关产品推荐
相关产品推荐

