指令注册
定义命令注册是介绍命令结构及其选项的第一步 以及参数。这与后续处理(如解析命令行输入和运行)松散解耦 真正的目标代码。本质上,它是向用户展示的命令 API 定义。
命令
一个命令Spring Shell结构被定义为命令数组。这得到
结构类似于以下示例:
command1 sub1
command2 sub1 subsub1
command2 sub2 subsub1
command2 sub2 subsub2
如果定义了子命令,我们目前不支持将命令映射到显式父命令。
例如命令1 子1和命令1 sub1 subsub1不能同时注册。 |
交互模式
Spring Shell 设计为两种模式:交互式(本质上是
是REPL在一系列命令中,你有一个活跃的壳实例)以及
非交互式(命令从命令行逐个执行)。
这些模式的区别主要在于对可做内容的限制 在每种模式中。例如,显示之前的栈跟踪是不可行的 如果壳不再激活,则该命令。一般来说,是壳体是否仍然活跃 决定了可用信息。
另外,服用活性药物REPL会话可能会提供更多关于用户经历的信息
在一个活跃的会议中进行。
选项
期权可以定义为多头和短头,前缀分别为 和 。
以下示例展示了多头和空头期权:---
CommandRegistration.builder()
.withOption()
.longNames("myopt")
.and()
.build();
CommandRegistration.builder()
.withOption()
.shortNames('s')
.and()
.build();
目标
目标定义命令的执行目标。它可以是POJO中的一种方法,
一个消费者,或功能.
方法
使用方法在现有的POJO中,POJO是定义目标的一种方式。
考虑以下类:
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();
功能
使用功能作为目标,它提供了很大的灵活性来处理
发生在命令执行中,因为你可以通过以下方式手动处理很多事情
一个命令上下文赋予功能.来自 的返回类型功能是
然后这些内容会被打印进壳壳。请考虑以下例子:
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();
消费者
使用消费者基本上等同于功能,区别为
没有返回类型。如果你需要把东西打印到壳里,
你可以获得一个参考终端从上下文出发,打印点东西
穿过它。请考虑以下例子:
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();