定义命令注册是介绍命令结构及其选项的第一步 和参数。这与稍后发生的事情松散地分离,例如解析命令行输入和运行 实际目标代码。从本质上讲,它是向用户显示的命令 API 的定义。
命令
结构中的命令定义为命令数组。这将产生一个
结构类似于以下示例:spring-shell
command1 sub1
command2 sub1 subsub1
command2 sub2 subsub1
command2 sub2 subsub2
如果定义了子命令,我们目前不支持将命令映射到显式父级。
例如,不能同时注册。command1 sub1 command1 sub1 subsub1 |
如果定义了子命令,我们目前不支持将命令映射到显式父级。
例如,不能同时注册。command1 sub1 command1 sub1 subsub1 |
交互模式
Spring Shell 被设计为在两种模式下工作:交互式(本质上
是您在一系列命令中拥有活动 shell 实例的地方)和
非交互式(从命令行逐个执行命令)。REPL
这些模式之间的区别主要在于对可以做什么的限制 在每种模式下。例如,显示以前的堆栈跟踪是不可行的 的命令(如果 shell 不再处于活动状态)。通常,shell 是否仍处于活动状态 指示可用信息。
此外,处于活动会话中可能会提供有关用户所处位置的更多信息
在活动会话中执行。REPL
选项
选项可以定义为长和短,其中前缀分别为 和 。
以下示例显示了多头和空头选项:--
-
CommandRegistration.builder()
.withOption()
.longNames("myopt")
.and()
.build();
CommandRegistration.builder()
.withOption()
.shortNames('s')
.and()
.build();
目标
目标定义命令的执行目标。它可以是 POJO 中的一种方法,
a 或 a .Consumer
Function
方法
在现有 POJO 中使用 a 是定义目标的一种方法。
请考虑以下类: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();
功能
使用 a 作为目标可以非常灵活地处理
在命令执行中发生,因为您可以使用
a 给定给 .a 的返回类型为
然后结果被打印到外壳中。请看以下示例:Function
CommandContext
Function
Function
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();
消费者
使用 a 与使用 a 基本相同,区别在于
没有返回类型。如果您需要将某些内容打印到 shell 中,
您可以从上下文中获取对 A 的引用并打印一些东西
通过它。请看以下示例:Consumer
Function
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();