Picocli: как всегда показывать заголовок / баннер

Picocli предлагает возможность добавить красивый заголовок в @Command аннотация, например:

@Command(name = "git-star", header = {
    "@|green       _ _      _             |@", 
    "@|green  __ _(_) |_ __| |_ __ _ _ _  |@",
    "@|green / _` | |  _(_-<  _/ _` | '_| |@",
    "@|green \\__, |_|\\__/__/\\__\\__,_|_|   |@",
    "@|green |___/                        |@"},
    description = "Shows GitHub stars for a project",
    mixinStandardHelpOptions = true, version = "git-star 0.1")

Как мне всегда показывать этот заголовок / баннер при запуске программы, не дублируя этот баннер в двух местах?

(См. Также https://github.com/remkop/picocli/issues/517).

2 ответа

Есть два аспекта этого:

  • Как получить текст баннера из приложения?
  • Как отобразить цвета и стили ANSI?

Вы можете получить баннер из справочного сообщения об использовании, либо с помощью new CommandLine(new App()).getCommandSpec().usageHelpMessage().header() или путем введения @Spec аннотированный CommandSpec поле в вашем приложении.

Чтобы отобразить стили ANSI, используйте CommandLine.Help.Ansi.AUTO.string(line) для каждой строки баннера.

Собираем все вместе:

@Command(name = "git-star", header = {
        "@|green       _ _      _             |@", 
        "@|green  __ _(_) |_ __| |_ __ _ _ _  |@",
        "@|green / _` | |  _(_-<  _/ _` | '_| |@",
        "@|green \\__, |_|\\__/__/\\__\\__,_|_|   |@",
        "@|green |___/                        |@"},
        description = "Shows GitHub stars for a project",
        mixinStandardHelpOptions = true, version = "git-star 0.1")
class GitStar implements Runnable {

  @Option(names = "-c")
  int count;

  @Spec CommandSpec spec;

  // prints banner every time the command is invoked
  public void run() {

    String[] banner = new CommandLine(new GitStar())
            .getCommandSpec().usageHelpMessage().header();

    // or: String[] banner = this.spec.header();

    for (String line : banner) {
      System.out.println(CommandLine.Help.Ansi.AUTO.string(line));
    }

    // business logic here...
  }

  public static void main(String[] args) {
    CommandLine.run(new GitStar(), args);
  }
}

У меня в Picocli 4.5.2 работает так:

      public void run() {
    CommandLine cmd = new CommandLine(new App());
    cmd.usage(System.out, Ansi.ON);

    // business logic here...
}
Другие вопросы по тегам