跳到主要内容

命令注册

ChatGPT-4o-mini 中英对照 Command Registration

定义命令注册是引入命令及其选项和参数结构的第一步。这与后续发生的事情(例如解析命令行输入和运行实际目标代码)是松散耦合的。本质上,它是向用户展示的命令 API 的定义。

命令

spring-shell 结构中,命令被定义为一个命令数组。这产生了一个类似于以下示例的结构:

command1 sub1
command2 sub1 subsub1
command2 sub2 subsub1
command2 sub2 subsub2
bash
备注

我们目前不支持将命令映射到显式父命令,如果定义了子命令。例如,command1 sub1command1 sub1 subsub1 不能同时注册。

交互模式

Spring Shell 被设计为可以在两种模式下工作:交互模式(本质上是一个 REPL,在一系列命令中保持一个活动的 shell 实例)和非交互模式(在这种模式下,命令从命令行一个接一个地执行)。

这些模式之间的区别主要在于每种模式下可以执行的操作的限制。例如,如果 shell 不再处于活动状态,则显示命令的先前堆栈跟踪将不可行。通常,shell 是否仍然处于活动状态决定了可用的信息。

此外,处于一个活跃的 REPL 会话中可能会提供更多关于用户在活跃会话中所做事情的信息。

选项

选项可以定义为长选项和短选项,其中前缀分别为 ---。以下示例展示了长选项和短选项:

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

目标

目标定义了命令的执行目标。它可以是 POJO 中的方法、一个 Consumer 或一个 Function

方法

使用一个 Method 在现有的 POJO 中是定义目标的一种方式。考虑以下类:

public static class CommandPojo {

String command(String arg) {
return arg;
}
}
java

根据前面列表中显示的现有类,您可以注册其方法:

CommandPojo pojo = new CommandPojo();
CommandRegistration.builder()
.command("command")
.withTarget()
.method(pojo, "command")
.and()
.withOption()
.longNames("arg")
.and()
.build();
java

函数

使用 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();
java

消费者

使用 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();
java