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...
}