领先一步
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 Boot 3
和 Spring Framework 6
更合理,Spring Shell
最终需要支持这两个版本。
以下是所做更改的摘要
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
中使用的模板并修改默认行为。这些模板也集成到主题框架中,以便可以为每个活动主题定义模板。