命令註冊
定義命令註冊是引入命令及其選項和引數結構的第一步。這與稍後發生的事情(例如解析命令列輸入和執行實際目的碼)鬆散解耦。本質上,它是向用戶展示的命令 API 的定義。
命令
在 spring-shell 結構中,命令被定義為命令陣列。這會產生一個類似於以下示例的結構
command1 sub1
command2 sub1 subsub1
command2 sub2 subsub1
command2 sub2 subsub2
我們目前不支援將命令對映到顯式父級(如果定義了子命令)。例如,不能同時註冊 command1 sub1 和 command1 sub1 subsub1。 |
互動模式
Spring Shell 已設計為在兩種模式下工作:互動式(本質上是一個 REPL,您在整個系列命令中都有一個活動的 shell 例項)和非互動式(命令從命令列逐個執行)。
這些模式之間的區別主要在於每種模式下的限制。例如,如果 shell 不再活動,則無法顯示命令的先前堆疊跟蹤。通常,shell 是否仍處於活動狀態決定了可用資訊。
此外,在活動的 REPL 會話中可以提供更多關於使用者在活動會話中所做的事情的資訊。
選項
選項可以定義為長選項和短選項,字首分別為 -- 和 -。以下示例展示了長選項和短選項
CommandRegistration.builder()
.withOption()
.longNames("myopt")
.and()
.build();
CommandRegistration.builder()
.withOption()
.shortNames('s')
.and()
.build();
目標
目標定義了命令的執行目標。它可以是 POJO 中的方法、Consumer 或 Function。
方法
使用現有 POJO 中的 Method 是一種定義目標的方法。考慮以下類
public static class CommandPojo {
String command(String arg) {
return arg;
}
}
給定前面列表中顯示的現有類,您可以註冊其方法
CommandPojo pojo = new CommandPojo();
CommandRegistration.builder()
.command("command")
.withTarget()
.method(pojo, "command")
.and()
.withOption()
.longNames("arg")
.and()
.build();
函式
使用 Function 作為目標可以為命令執行中發生的事情提供很大的靈活性,因為您可以透過使用提供給 Function 的 CommandContext 來手動處理許多事情。Function 的返回型別隨後會作為結果列印到 shell 中。考慮以下示例
CommandRegistration.builder()
.command("command")
.withTarget()
.function(ctx -> {
String arg = ctx.getOptionValue("arg");
return String.format("hi, arg value is '%s'", arg);
})
.and()
.withOption()
.longNames("arg")
.and()
.build();
消費者
使用 Consumer 基本與使用 Function 相同,不同之處在於沒有返回型別。如果您需要向 shell 列印一些內容,您可以從上下文中獲取 Terminal 的引用並透過它列印。考慮以下示例
CommandRegistration.builder()
.command("command")
.withTarget()
.consumer(ctx -> {
String arg = ctx.getOptionValue("arg");
ctx.getTerminal().writer()
.println(String.format("hi, arg value is '%s'", arg));
})
.and()
.withOption()
.longNames("arg")
.and()
.build();