Command Registration

定义命令注册是介绍命令及其选项和参数结构的第一步。这与后来发生的事情(例如解析命令行输入和运行实际目标代码)大体无关。从本质上来说,这是向用户展示的命令 API 的定义。

Commands

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

command1 sub1
command2 sub1 subsub1
command2 sub2 subsub1
command2 sub2 subsub2

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

Interaction Mode

Spring Shell 被设计为以两种模式工作:交互式(其本质上是 REPL,其中你有 shell 实例贯穿于一系列命令)和非交互式(其中命令从命令行逐个执行)。

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

此外,处于活动 REPL 会话中可能会提供有关用户在活动会话中已经做了 чего 的更多信息。

Options

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

link:../../../../../src/test/java/org/springframework/shell/docs/CommandRegistrationSnippets.java[role=include]
link:../../../../../src/test/java/org/springframework/shell/docs/CommandRegistrationSnippets.java[role=include]

Target

目标定义命令的执行目标。它可以是 POJO 中的方法、 ConsumerFunction

Method

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

link:../../../../../src/test/java/org/springframework/shell/docs/CommandTargetSnippets.java[role=include]

考虑到前面清单中显示的现有类,然后你可以注册其方法:

link:../../../../../src/test/java/org/springframework/shell/docs/CommandTargetSnippets.java[role=include]

Function

使用 Function 作为目标提供了很大的灵活性来处理命令执行中的内容,因为你可以使用给定 FunctionCommandContext 手动处理很多事情。然后, Function 的返回类型将作为结果打印到 shell 中。考虑以下示例:

link:../../../../../src/test/java/org/springframework/shell/docs/CommandTargetSnippets.java[role=include]

Consumer

使用 Consumer 基本上与使用 Function 相同,区别在于没有返回类型。如果你需要将某内容打印到 shell 中,你可以从上下文获取 Terminal 的引用并通过它打印某内容。考虑以下示例:

link:../../../../../src/test/java/org/springframework/shell/docs/CommandTargetSnippets.java[role=include]