我代表团队和所有做出贡献的人,很高兴地宣布Spring Shell2.1.0 已经发布,现在可以从repo.spring.io/milestone。
更多细节请参见发布说明。
感谢所有通过问题报告和拉动请求做出贡献的人。
今年早些时候,我们开始努力使项目与最新的Spring Boot 和Spring Framework 版本保持一致,因为很难使用现有的Spring Shell 版本的Spring家族。
最初,我们想解决的主要问题是删除一个Bean循环,现在Spring Boot 已经默认执行了。虽然这个功能可以被关闭,但它不是Spring Shell应该要求的。这需要大量的修改,我们选择通过重做Shell的内部结构来处理这个问题。一个很大的挑战是旧的Spring Shell ,它基本上是通过@ShellMethod 注释来保留命令信息方法,然后通过反射用不太明确的方式调用这些方法。
现在很清楚,我们需要做一个更大的改革,现在做进一步的开发是有意义的,而不是等待Spring Boot 3 和Spring Framework 6 ,因为Spring Shell 最终会需要支持。
下面是对所做修改的回顾。
命令注册
CommandRegistration 是一种定义命令的新的程序化方式。现有的命令注解模型转化为场景背后的这些注册。这个新的注册模型现在允许我们动态地控制命令,这在旧的shell实现中是不可能的。
现有的注解
@ShellMethod 和@ShellOption 的内容,我们试图保持这些兼容,未来的发展很可能会引入与CommandRegistration 更一致的新注释。
命名
现代终端的实现并不局限于显示一个简单的文本,而是允许不同类型的字体风格,并且可以使用颜色。在旧的Spring Shell ,这些大多是硬编码的,而通过JLine ,可以使用ANSI序列向控制台写任何东西。引入一个主题系统是有意义的,在这个系统中,所写的文本可以有不同的风格,并且可以根据风格选择数字。数字是现代终端所支持的统一编码字符,这是创建漂亮的Shell用户界面的基础*。*


UI组件
你很可能使用过各种CLI工具,这些工具不仅仅是向用户询问一些文本,然后在此基础上做一些事情。例如,GitHub CLI就是一个很好的例子,它的一些命令会进入交互模式,并使用各种技巧要求用户输入,如选择器列表和其他类型的shell风格的表单。
我们在Spring Shell 中想要完成的是创建这些组件,它们可以独立使用,也可以将这些组件组合成一个流程。
Graal
在未来的Spring框架版本中,一个重要的话题是用GraalVM进行本地编译。这显然对CLI方面有很大的影响,因为当你的现有代码被翻译成本地二进制时,那个小小的jvm引导超时就消失了。
通过2.1.x ,我们用实验性的Spring Native项目表明,可以创建一个Spring Shell应用程序,在Linux、MacOS和Windows中以同样的方式工作。



在Spring Shell中对GraalVM的正式支持是在3.x 。
模板化
在终端中编写命令是很容易的,因为你基本上只是写一些东西。然而,我们在一些内置的命令中所做的工作,如help ,并不总是用户想要的,或者他们可能有其他原因要修改它的外观。来自Spring Shell 的一些默认输出现在是基于来自ANTRL 项目的基于ST4的模板。
这允许用户替换Spring Shell 中使用的模板并修改默认行为。这些模板也集成到主题框架中,这样就有可能为每个活动主题定义模板。