抢占先机
VMware 提供培训和认证,助您加速进步。
了解更多我代表团队和所有贡献者,很高兴宣布 Spring Shell 2.1.0
已经发布,现可从 https://repo.spring.io/milestone 获取。
请查看 发布说明 了解更多详情。
感谢所有通过问题报告和拉取请求做出贡献的人。
今年早些时候,我们开始努力将项目与最新的 Spring Boot
和 Spring Framework
版本对齐,因为使用现有的 Spring 系列 Spring Shell
版本很困难。
最初我们想要解决的主要问题是移除 bean 循环,Spring Boot
现在默认强制执行这一点。虽然此功能可以关闭,但这并不是 Spring Shell 应该要求的。这需要大量的更改,我们选择通过重写 shell 内部来实现。一个巨大的挑战是旧版本 Spring Shell
的工作方式,它基本上通过由 @ShellMethod
注解支持来维护命令信息方法,然后以不太明确的方式通过反射调用这些方法。
既然清楚需要进行更大范围的全面修订,那么现在进行进一步开发比等待 Spring Shell
最终需要支持的 Spring Boot 3
和 Spring Framework 6
更有意义。
以下是对已完成更改的回顾
CommandRegistration
是一种新的以编程方式定义命令的方法。现有的命令注解模型在幕后会转换为这些注册。这种新的注册模型现在允许我们动态控制命令,这在旧的 shell 实现中是不可能的。
关于 @ShellMethod
和 @ShellOption
,我们已努力保持其兼容性,未来开发很可能会引入更多与 CommandRegistration
对齐的新注解。
现代终端实现不仅限于显示简单文本,还允许使用不同的字体样式并可以使用颜色。在旧版本的 Spring Shell
中,这些大部分是硬编码的,虽然可以通过 JLine
使用 ANSI 序列将任何内容写入控制台。引入一个主题系统是有意义的,在该系统中,可以对写入的文本进行样式设置,并根据样式选择图形。图形只是现代终端支持的 unicode 字符,这是创建漂亮的 shell UI 的基础。
你很可能使用过各种 CLI 工具,它们不仅仅是向用户询问一些文本然后基于此进行操作。例如,GitHub CLI 就是一个很好的例子,因为它的一些命令会进入交互模式,并使用各种技巧(如选择器列表和其他 shell 样式表单)向用户请求输入。
我们在 Spring Shell
中想要实现的是创建这些组件,它们可以独立使用或组合成一个流程。
在未来的 Spring Framework 版本中,使用 GraalVM 进行原生编译是一个重要议题。当您现有代码被翻译成原生二进制文件时,这显然会对 CLI 侧产生重大影响,因为那个微小的 jvm 引导超时会消失。
使用 2.1.x
版本,我们通过实验性的 Spring Native 项目表明,可以创建一个在 Linux、MacOS 和 Windows 中以相同方式工作的 Spring Shell 应用程序。
Spring Shell 对 GraalVM 的官方支持将在 3.x
版本中提供。
在终端中编写命令非常容易,您只需输入一些内容。然而,我们在某些内置命令(例如 help
)中所做的并不总是用户想要的,或者他们可能有其他原因来修改其外观。Spring Shell
中的一些默认输出现在基于 ANTRL
项目的 ST4 模板。
这允许用户替换 Spring Shell
中使用的模板并修改默认行为。这些模板还集成到主题框架中,因此可以为每个活动主题定义模板。