Я перешел с интерфейса командной строки Apache Commons на Picocli из-за поддержки дополнительных команд (и объявления на основе аннотаций).
Рассмотрим инструмент командной строки, такой как git
, с дополнительными командами, такими как push
. В Git есть главный переключатель --verbose
или -v
для включения подробного режима во всех подкомандах всех. Как я могу реализовать главный переключатель, который выполняется до любых подкоманд?
Это мой тест
@CommandLine.Command(name = "push",
description = "Update remote refs along with associated objects")
class PushCommand implements Callable<Void> {
@Override
public Void call() throws Exception {
System.out.println("#PushCommand.call");
return null;
}
}
@CommandLine.Command(description = "Version control", subcommands = {PushCommand.class})
public class GitApp implements Callable<Void> {
@CommandLine.Option(names = {"-h", "--help"}, usageHelp = true, description = "Display this help message.")
private boolean usageHelpRequested;
@CommandLine.Option(names = {"-v", "--verbose"}, description = "Verbose mode. Helpful for troubleshooting.")
private boolean verboseMode;
public static void main(String[] args) {
GitApp app = new GitApp();
CommandLine.call(app, "--verbose", "push");
System.out.println("#GitApp.main after. verbose: " + (app.verboseMode));
}
@Override
public Void call() throws Exception {
System.out.println("#GitApp.call");
return null;
}
}
Выход
#PushCommand.call
#GitApp.main after. verbose: true
Я ожидал, что GitApp.call
будет вызван до вызова подкоманды. Но вызывается только подкоманда.