当前位置 : 主页 > 编程语言 > java >

Spring Shell Reference Documentation(参考文档)(一)

来源:互联网 收集:自由互联 发布时间:2023-02-04
10. 执行 本节介绍如何设置 Spring Shell 以在交互模式下工作。 10.1. 交互模式 版本 2.1.x 引入了用于区分交互式的内置支持 和非交互模式。这使得将外壳用作 简单的命令行工具,无需自定

Spring Shell Reference Documentation(参考文档)(一)_spring

10. 执行

本节介绍如何设置 Spring Shell 以在交互模式下工作。

10.1. 交互模式

版本 2.1.x 引入了用于区分交互式的内置支持 和非交互模式。这使得将外壳用作 简单的命令行工具,无需自定义。

目前,如果在启动时传递了任何命令行选项,则进入交互模式 或从命令行运行 shell。这在外壳应用程序时特别有效 使用本机支持进行编译。

某些命令在交互模式下运行时可能没有任何有用的含义 或(相反)在非交互模式下。例如,内置命令将 在非交互模式下没有任何意义,因为它用于退出交互模式。​​exit​​

注释有一个名为的字段,可用于通知 关于特定命令何时可用的外壳。​​@ShellMethod​​​​interactionMode​​

附录A:附录:技术介绍

本附录包含面向开发人员和其他想要了解有关Spring Shell如何的更多信息的信息 内部工作及其设计决策是什么。

A.1. 命令注册

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

A.1.1. 命令

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

command1 sub1command2 sub1 subsub1command2 sub2 subsub1command2 sub2 subsub2

如果定义了子命令,我们目前不支持将命令映射到显式父级。 例如,不能同时注册。​​command1 sub1​​​​command1 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 或 .​​Consumer​​​​Function​​

方法

在现有 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 给定给 .来自 的返回类型是 然后结果将什么打印到外壳中。请考虑以下示例:​​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 基本相同,区别在于 没有返回类型。如果您需要将某些内容打印到外壳中, 您可以从上下文中获取对 的引用并打印一些内容 通过它。请考虑以下示例:​​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();

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 以动态 解析从命令名称到其实例的映射。考虑 以下示例:​​CommandResolver​​​​CommandRegistration​​

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 注册到目录中。 请考虑以下示例:​​CommandCatalogCustomizer​​​​CommandCatalog​​​​spring-shell​​​​CommandRegistration​​

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. 主题

主题中的样式通过使用 中的属性字符串提供。 不幸的是,样式大多没有记录,但我们尝试通过 它的一些功能在这里。​​JLine​​​​JLine​​

在样式规范中是具有特殊格式的字符串。可以给出规格 如果用逗号分隔,则多次。规范将定义颜色 前景、背景或其模式。特殊格式允许 如果前者由于某种原因无效,则在后一个规范中定义默认值。​​JLine​​​​<spec>:=<spec>​​

如果规范包含冒号,则其前一部分表示前景或背景 可能的值为 、、、、、、没有 rbg 的颜色值 是允许的颜色 、、 或 的名称。颜色分别有其短格式、 和。如果颜色以 或 为前缀,则自动显示亮模式 应用的。前缀将从 JLine 内部 bsd 颜色表解析。​​foreground​​​​fg​​​​f​​​​background​​​​bg​​​​b​​​​foreground-rgb​​​​fg-rgb​​​​f-rgb​​​​background-rgb​​​​bg-rgb​​​​b-rgb​​​​black​​​​red​​​​green​​​​yellow​​​​blue​​​​magenta​​​​cyan​​​​white​​​​k​​​​r​​​​g​​​​y​​​​b​​​​m​​​​c​​​​w​​​​!​​​​bright-​​​​~​​

如果 rgb 格式是预期的,并且前缀为任一或普通格式 使用十六进制格式。​​x​​​​#​​

fg-redfg-rfg-rgb:redfg-rgb:xff3333fg-rgb:#ff3333

如果规范包含特殊名称 、 、 、 或 使用现有颜色相应地更改样式。​​default​​​​bold​​​​faint​​​​italic​​​​underline​​​​blink​​​​inverse​​​​inverse-neg​​​​inverseneg​​​​conceal​​​​crossed-out​​​​crossedout​​​​hidden​​

boldbold,fg:red

如果 spec 是用分号分隔的数字或数字,则格式是 ansi 的普通部分 ASCII 代码。

3131;1

JLine特殊的映射格式,可以解决以点开头的规范不能 使用,因为我们还没有将它们映射到Spring Shell样式名称中。

上一篇:Spring Statemachine状态机的概念(二)
下一篇:没有了
网友评论