Spring Shell参考文档(一)中包含哪些内容?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2169个文字,预计阅读时间需要9分钟。
10. 执行本节介绍如何设置Spring Shell以在交互模式下工作。
10.1. 交互模式
版本 2.1.x 引入了用于区分交互和非交互模式的内置支持。这使得将Spring Shell用作外壳工具变得简单,无需自定义。10. 执行
本节介绍如何设置 Spring Shell 以在交互模式下工作。
10.1. 交互模式
版本 2.1.x 引入了用于区分交互式的内置支持 和非交互模式。这使得将外壳用作 简单的命令行工具,无需自定义。
目前,如果在启动时传递了任何命令行选项,则进入交互模式 或从命令行运行 shell。这在外壳应用程序时特别有效 使用本机支持进行编译。
某些命令在交互模式下运行时可能没有任何有用的含义 或(相反)在非交互模式下。例如,内置命令将 在非交互模式下没有任何意义,因为它用于退出交互模式。exit
注释有一个名为的字段,可用于通知 关于特定命令何时可用的外壳。@ShellMethodinteractionMode
附录A:附录:技术介绍
本附录包含面向开发人员和其他想要了解有关Spring Shell如何的更多信息的信息 内部工作及其设计决策是什么。
A.1. 命令注册
定义命令注册是引入命令结构及其选项的第一步 和参数。这与稍后发生的情况松散地分离,例如解析命令行输入和运行 实际目标代码。本质上,它是向用户显示的命令 API 的定义。
A.1.1. 命令
结构中的命令定义为命令数组。这会产生一个 结构类似于以下示例:spring-shell
command1 sub1command2 sub1 subsub1command2 sub2 subsub1command2 sub2 subsub2如果定义了子命令,我们目前不支持将命令映射到显式父级。 例如,不能同时注册。command1 sub1command1 sub1 subsub1
A.1.2. 交互模式
Spring Shell被设计为在两种模式下工作:交互式(本质上是 是一个在一系列命令中都有一个活动的 shell 实例)和 非交互式(命令从命令行逐个执行)。REPL
这些模式之间的区别主要围绕可以做什么的限制 在每种模式下。例如,显示以前的堆栈跟踪是不可行的 的命令(如果外壳不再处于活动状态)。一般来说,外壳是否仍然处于活动状态 指示可用信息。
此外,处于活动会话中可能会提供有关用户的更多信息 在活动会话中执行。REPL
A.1.3. 选项
选项可以定义为 long 和 short,其中前缀分别为 和 。 以下示例显示了长选项和短选项:---
CommandRegistration.builder() .withOption() .longNames("myopt") .and() .build();CommandRegistration.builder() .withOption() .shortNames('s') .and() .build();A.1.4. 目标
目标定义命令的执行目标。它可以是POJO中的一种方法, a 或 .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();功能
使用 a 作为目标提供了很大的灵活性来处理什么 发生在命令执行中,因为您可以使用 a 给定给 .来自 的返回类型是 然后结果将什么打印到外壳中。请考虑以下示例:FunctionCommandContextFunctionFunction
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 基本相同,区别在于 没有返回类型。如果您需要将某些内容打印到外壳中, 您可以从上下文中获取对 的引用并打印一些内容 通过它。请考虑以下示例:ConsumerFunctionTerminal
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();A.2. 命令解析器
在执行命令之前,我们需要解析命令以及用户可能提供的任何选项。解析 介于命令注册和命令执行之间。
A.3. 命令执行
当命令解析完成其工作并解析命令注册时,命令执行 完成运行代码的艰苦工作。
A.4. 命令上下文
该接口允许访问当前正在运行的 上下文。您可以使用它来访问选项:CommandContext
String arg = ctx.getOptionValue("arg");如果你需要将某些内容打印到 shell 中,您可以获取 a 并使用其编写器打印一些内容:Terminal
ctx.getTerminal().writer().println("hi");A.5. 命令目录
该接口定义命令注册的存在方式 外壳应用程序。可以动态注册和取消注册 命令,这为用例提供了灵活性,如果可能命令 来来去去,取决于外壳的状态。请考虑以下示例:CommandCatalog
CommandRegistration registration = CommandRegistration.builder().build();catalog.register(registration);A.5.1. 命令解析器
您可以实现接口并定义一个 Bean 以动态 解析从命令名称到其实例的映射。考虑 以下示例:CommandResolverCommandRegistration
static class CustomCommandResolver implements CommandResolver { List<CommandRegistration> registrations = new ArrayList<>(); CustomCommandResolver() { CommandRegistration resolved = CommandRegistration.builder() .command("resolve command") .build(); registrations.add(resolved); } @Override public List<CommandRegistration> resolve() { return registrations; }}a 的当前限制是每次解析命令时都会使用它。 因此,如果命令解析调用需要很长时间,我们建议不要使用它,因为它会 使外壳感觉迟钝。CommandResolver
A.5.2. 命令目录定制器
您可以使用该界面自定义 . 它的主要用途是修改目录。此外,在自动配置中,这 接口用于将现有 Bean 注册到目录中。 请考虑以下示例:CommandCatalogCustomizerCommandCatalogspring-shellCommandRegistration
static class CustomCommandCatalogCustomizer implements CommandCatalogCustomizer { @Override public void customize(CommandCatalog commandCatalog) { CommandRegistration registration = CommandRegistration.builder() .command("resolve command") .build(); commandCatalog.register(registration); }}你可以创建一个作为bean,Spring Shell处理其余的。CommandCatalogCustomizer
A.6. 主题
主题中的样式通过使用 中的属性字符串提供。 不幸的是,样式大多没有记录,但我们尝试通过 它的一些功能在这里。JLineJLine
在样式规范中是具有特殊格式的字符串。可以给出规格 如果用逗号分隔,则多次。规范将定义颜色 前景、背景或其模式。特殊格式允许 如果前者由于某种原因无效,则在后一个规范中定义默认值。JLine<spec>:=<spec>
如果规范包含冒号,则其前一部分表示前景或背景 可能的值为 、、、、、、没有 rbg 的颜色值 是允许的颜色 、、 或 的名称。颜色分别有其短格式、 和。如果颜色以 或 为前缀,则自动显示亮模式 应用的。前缀将从 JLine 内部 bsd 颜色表解析。foregroundfgfbackgroundbgbforeground-rgbfg-rgbf-rgbbackground-rgbbg-rgbb-rgbblackredgreenyellowbluemagentacyanwhitekrgybmcw!bright-~
如果 rgb 格式是预期的,并且前缀为任一或普通格式 使用十六进制格式。x#
fg-redfg-rfg-rgb:redfg-rgb:xff3333fg-rgb:#ff3333如果规范包含特殊名称 、 、 、 或 使用现有颜色相应地更改样式。defaultboldfaintitalicunderlineblinkinverseinverse-neginversenegconcealcrossed-outcrossedouthidden
boldbold,fg:red如果 spec 是用分号分隔的数字或数字,则格式是 ansi 的普通部分 ASCII 代码。
3131;1JLine特殊的映射格式,可以解决以点开头的规范不能 使用,因为我们还没有将它们映射到Spring Shell样式名称中。
本文共计2169个文字,预计阅读时间需要9分钟。
10. 执行本节介绍如何设置Spring Shell以在交互模式下工作。
10.1. 交互模式
版本 2.1.x 引入了用于区分交互和非交互模式的内置支持。这使得将Spring Shell用作外壳工具变得简单,无需自定义。10. 执行
本节介绍如何设置 Spring Shell 以在交互模式下工作。
10.1. 交互模式
版本 2.1.x 引入了用于区分交互式的内置支持 和非交互模式。这使得将外壳用作 简单的命令行工具,无需自定义。
目前,如果在启动时传递了任何命令行选项,则进入交互模式 或从命令行运行 shell。这在外壳应用程序时特别有效 使用本机支持进行编译。
某些命令在交互模式下运行时可能没有任何有用的含义 或(相反)在非交互模式下。例如,内置命令将 在非交互模式下没有任何意义,因为它用于退出交互模式。exit
注释有一个名为的字段,可用于通知 关于特定命令何时可用的外壳。@ShellMethodinteractionMode
附录A:附录:技术介绍
本附录包含面向开发人员和其他想要了解有关Spring Shell如何的更多信息的信息 内部工作及其设计决策是什么。
A.1. 命令注册
定义命令注册是引入命令结构及其选项的第一步 和参数。这与稍后发生的情况松散地分离,例如解析命令行输入和运行 实际目标代码。本质上,它是向用户显示的命令 API 的定义。
A.1.1. 命令
结构中的命令定义为命令数组。这会产生一个 结构类似于以下示例:spring-shell
command1 sub1command2 sub1 subsub1command2 sub2 subsub1command2 sub2 subsub2如果定义了子命令,我们目前不支持将命令映射到显式父级。 例如,不能同时注册。command1 sub1command1 sub1 subsub1
A.1.2. 交互模式
Spring Shell被设计为在两种模式下工作:交互式(本质上是 是一个在一系列命令中都有一个活动的 shell 实例)和 非交互式(命令从命令行逐个执行)。REPL
这些模式之间的区别主要围绕可以做什么的限制 在每种模式下。例如,显示以前的堆栈跟踪是不可行的 的命令(如果外壳不再处于活动状态)。一般来说,外壳是否仍然处于活动状态 指示可用信息。
此外,处于活动会话中可能会提供有关用户的更多信息 在活动会话中执行。REPL
A.1.3. 选项
选项可以定义为 long 和 short,其中前缀分别为 和 。 以下示例显示了长选项和短选项:---
CommandRegistration.builder() .withOption() .longNames("myopt") .and() .build();CommandRegistration.builder() .withOption() .shortNames('s') .and() .build();A.1.4. 目标
目标定义命令的执行目标。它可以是POJO中的一种方法, a 或 .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();功能
使用 a 作为目标提供了很大的灵活性来处理什么 发生在命令执行中,因为您可以使用 a 给定给 .来自 的返回类型是 然后结果将什么打印到外壳中。请考虑以下示例:FunctionCommandContextFunctionFunction
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 基本相同,区别在于 没有返回类型。如果您需要将某些内容打印到外壳中, 您可以从上下文中获取对 的引用并打印一些内容 通过它。请考虑以下示例:ConsumerFunctionTerminal
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();A.2. 命令解析器
在执行命令之前,我们需要解析命令以及用户可能提供的任何选项。解析 介于命令注册和命令执行之间。
A.3. 命令执行
当命令解析完成其工作并解析命令注册时,命令执行 完成运行代码的艰苦工作。
A.4. 命令上下文
该接口允许访问当前正在运行的 上下文。您可以使用它来访问选项:CommandContext
String arg = ctx.getOptionValue("arg");如果你需要将某些内容打印到 shell 中,您可以获取 a 并使用其编写器打印一些内容:Terminal
ctx.getTerminal().writer().println("hi");A.5. 命令目录
该接口定义命令注册的存在方式 外壳应用程序。可以动态注册和取消注册 命令,这为用例提供了灵活性,如果可能命令 来来去去,取决于外壳的状态。请考虑以下示例:CommandCatalog
CommandRegistration registration = CommandRegistration.builder().build();catalog.register(registration);A.5.1. 命令解析器
您可以实现接口并定义一个 Bean 以动态 解析从命令名称到其实例的映射。考虑 以下示例:CommandResolverCommandRegistration
static class CustomCommandResolver implements CommandResolver { List<CommandRegistration> registrations = new ArrayList<>(); CustomCommandResolver() { CommandRegistration resolved = CommandRegistration.builder() .command("resolve command") .build(); registrations.add(resolved); } @Override public List<CommandRegistration> resolve() { return registrations; }}a 的当前限制是每次解析命令时都会使用它。 因此,如果命令解析调用需要很长时间,我们建议不要使用它,因为它会 使外壳感觉迟钝。CommandResolver
A.5.2. 命令目录定制器
您可以使用该界面自定义 . 它的主要用途是修改目录。此外,在自动配置中,这 接口用于将现有 Bean 注册到目录中。 请考虑以下示例:CommandCatalogCustomizerCommandCatalogspring-shellCommandRegistration
static class CustomCommandCatalogCustomizer implements CommandCatalogCustomizer { @Override public void customize(CommandCatalog commandCatalog) { CommandRegistration registration = CommandRegistration.builder() .command("resolve command") .build(); commandCatalog.register(registration); }}你可以创建一个作为bean,Spring Shell处理其余的。CommandCatalogCustomizer
A.6. 主题
主题中的样式通过使用 中的属性字符串提供。 不幸的是,样式大多没有记录,但我们尝试通过 它的一些功能在这里。JLineJLine
在样式规范中是具有特殊格式的字符串。可以给出规格 如果用逗号分隔,则多次。规范将定义颜色 前景、背景或其模式。特殊格式允许 如果前者由于某种原因无效,则在后一个规范中定义默认值。JLine<spec>:=<spec>
如果规范包含冒号,则其前一部分表示前景或背景 可能的值为 、、、、、、没有 rbg 的颜色值 是允许的颜色 、、 或 的名称。颜色分别有其短格式、 和。如果颜色以 或 为前缀,则自动显示亮模式 应用的。前缀将从 JLine 内部 bsd 颜色表解析。foregroundfgfbackgroundbgbforeground-rgbfg-rgbf-rgbbackground-rgbbg-rgbb-rgbblackredgreenyellowbluemagentacyanwhitekrgybmcw!bright-~
如果 rgb 格式是预期的,并且前缀为任一或普通格式 使用十六进制格式。x#
fg-redfg-rfg-rgb:redfg-rgb:xff3333fg-rgb:#ff3333如果规范包含特殊名称 、 、 、 或 使用现有颜色相应地更改样式。defaultboldfaintitalicunderlineblinkinverseinverse-neginversenegconcealcrossed-outcrossedouthidden
boldbold,fg:red如果 spec 是用分号分隔的数字或数字,则格式是 ansi 的普通部分 ASCII 代码。
3131;1JLine特殊的映射格式,可以解决以点开头的规范不能 使用,因为我们还没有将它们映射到Spring Shell样式名称中。

