命令註冊

定義命令註冊是引入命令及其選項和引數結構的第一步。這與稍後發生的事情(例如解析命令列輸入和執行實際目的碼)鬆散解耦。本質上,它是向用戶展示的命令 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();
© . This site is unofficial and not affiliated with VMware.