命令註冊

定義命令註冊是引入命令結構及其選項和參數的第一步。這與稍後發生的事情(例如,解析命令列輸入和執行實際目標程式碼)鬆散地解耦。 本質上,它是向使用者顯示的命令 API 的定義。

命令

spring-shell 結構中的命令定義為命令陣列。 這產生了類似於以下範例的結構

command1 sub1
command2 sub1 subsub1
command2 sub2 subsub1
command2 sub2 subsub2
如果定義了子命令,我們目前不支援將命令映射到明確的父級。 例如,command1 sub1command1 sub1 subsub1 無法同時註冊。

互動模式

Spring Shell 旨在以兩種模式運作:互動式(本質上是 REPL,您在整個命令序列中都有一個活動的 Shell 實例)和非互動式(命令從命令列逐個執行)。

這些模式之間的差異主要圍繞著每種模式可以完成的事情的限制。 例如,如果 Shell 不再處於活動狀態,則顯示先前命令的堆疊追蹤是不可行的。 一般來說,Shell 是否仍然處於活動狀態決定了可用的資訊。

此外,處於活動的 REPL 會話中可能會提供有關使用者在活動會話中所做操作的更多資訊。

選項

選項可以定義為長選項和短選項,其中前綴分別為 ---。 以下範例顯示了長選項和短選項

CommandRegistration.builder()
	.withOption()
		.longNames("myopt")
		.and()
	.build();
CommandRegistration.builder()
	.withOption()
		.shortNames('s')
		.and()
	.build();

目標

目標定義了命令的執行目標。 它可以是 POJO 中的方法、ConsumerFunction

方法

在現有的 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 作為目標可以提供很大的靈活性來處理命令執行中發生的事情,因為您可以使用提供給 FunctionCommandContext 手動處理許多事情。 然後,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();