66 months ago

遇见CUBA CLI

众所周知,在软件开发者的世界,特别是Java开发者,充满着键盘狂人,他们宁愿多敲10-15个字符也不愿点击一下鼠标。CUBA的社区也没有例外,所以经常有人问我们,“怎么可以不用CUBA Studio而开始一个新项目呢?” 或者 “有没有免费轻量级的命令行程序能替代Studio呢?”,有的,这里就有个好消息!

免费的CLI真的能替换收费的Studio嘛?

CLI并不是为了替换Studio,他有自己的使命。对于十分熟悉Spring框架,JPA以及CUBA架构的开发者来说,CLI非常有用。并且(很重要哦!),可以让他们很舒服的在黑屏幕灰色字块的环境工作。简单说,cuba-cli是个命令行工具,可以用它来很容易地创建基于CUBA平台的项目。以及,它为CUBA项目的主要工件提供轻量级的脚手架代码,比如entities、screens、services等。

text

但同时,Studio还是作为CUBA世界入门的捷径,因为它能提供非常直观的用户界面。通过直观的界面,哪怕是没有接触过CUBA的新用户也能很容易的在几分钟内设计他自己的第一个应用程序,而且甚至不需要任何JPA/Spring或者其他底层技术的经验。事实上,对于开发标准的增删查改的应用程序来说,不需要敲一行代码,Studio可以替你完成所有的事情。另外,对于从其他框架生态系统移植到CUBA的人还有习惯了在一个非常舒服的IDE开发的人来说,Studio是个不错的选择。

text

总结一下,CUBA Studio更多关注于“边做边学”以及“超级省时”,而CLI是为你编写你讨厌而必须的脚手架代码的苦劳力。

CLI能干什么?

很明显,首先你要有CLI。CL支持主流的操作系统,这里可以找到各自的安装向导。装完后,在命令行敲 cuba-cli ,好了,可以开始新项目或者通过CLI操控现有的项目了。敲tab键可以看到所有支持的命令。选择或者输入help命令可以看到每个命令的介绍。下面我们介绍下这些命令,看看他们到底是做什么的,以及这些命令怎么节省开发者的时间和延长键盘寿命。

通用功能

  • help, version, exit, cd - 这些命令看名字就懂,不介绍了。

项目配置和全局设置

  • create-app- 按照向导完成所有步骤即可创建一个CUBA项目:项目名称,命名空间,根目录包名,平台版本以及数据库配置。创建的项目包含三个模块:global(core和web模块都能访问),core(服务端层,主要的业务逻辑),web(服务端层,页面控制器以及其他GUI逻辑)。
  • polymer - 为项目添加基于Polymer的客户端,Polymer是谷歌开发的前端框架。这个步骤会为新模块修改 settings.gradle 以及 build.gradle 文件,添加模块的配置项;还会创建模块需要的图片资源,生成登录页,菜单栏和其他一些有用的前端web组件。
  • theme - 会在 modules/web 目录创建一个特殊的目录结构,添加一些应用默认的品牌图片(登录图标,菜单图标,favicon)以及一些scss文件,可以修改这些文件更改默认主题。还会在项目添加 webThemesModule 模块以及在gradle配置文件做相应的修改。最后,这个命令会添加 deployThemes 这个gradle任务,可以运行这个任务部署主题样式改动而不需要重启服务。CUBA手册的这部分做了详细介绍。
  • add-component - 将一个已有的应用程序组件添加到本项目。这个命令会在build.gradle里面添加一行新的依赖并且修改web模块的 web.xml 文件将组件的包添加到 appComponents 参数。

领域模型

  • entity - 为JPA实体创建桩代码和相应的DDL数据库脚本。根据实体类型的不同(是否是持久化实体),也会相应的在 persistence.xml 或 metadata.xml 文件注册实体。最后CLI为实体属性创建语言包以便用来做本地化。
  • enumeration - 生成实现EnumClass接口的枚举类型,枚举字段可以有本地化语言支持,并且有个很有用的方法 fromId。

业务逻辑

  • entity-listener - 创建实现了实体监听器接口的Spring组件脚手架代码,并且在相应的实体类中进行声明。这种监听器会在实体的状态发生改变时被触发。这里有更多的信息。
  • service - 在global模块创建服务接口,在core模块创建服务的实现类,也都是脚手架代码。为了能在web模块使用服务,也在web-spring.xml 的 WebRemoteProxyBeanCreator bean里面注册了这个服务。
  • bean - 生成Spring组件,省掉你敲150个字符的时间。
  • config - 指定模块,指定存储类型(system,DB或者App),然后创建CUBA配置的接口脚手架代码。CUBA手册的这章节详细介绍了CUBA配置接口的使用。

用户界面

  • screen - 创建GUI页面的脚手架代码。这个命令支持创建:
    • 一个新的空页面
    • 扩展已有页面
    • 一个浏览页面:带有实体列表的页面,并且有CRUD按钮以及过滤器。
    • 一个编辑页面:用来创建或者编辑单个实体的页面。

这个命令会创建xml页面描述文件、Java控制器的脚手架代码,也会创建本地化语言包。同时也可以选择是否将页面添加到主菜单。

项目gradle任务

  • gradle - 代理执行 gradlew或者gradlew.bat 命令,在gradle命令之后带上需要执行的参数即可。如果存在gradlew或者gradlew.bat,则会执行相应的命令,否则会显示找不到相应文件的错误。

  • deploy - 这个命令不是真正的部署,需要部署可以通过上面的gradle命令来执行需要的部署任务。这个命令是用来修改build.gradle文件创建war和UberJar的gradle任务。

其他

  • app-component - 将你的CUBA应用程序转成可插拔的CUBA应用组件。可以在这个文档找到更多关于此概念的介绍。此命令会生成 app-component.xml 文件,定义了此组件依赖的其他组件,描述了现有的应用模块、生成的工件以及暴露的应用程序属性。当运行这个命令时,会提示要求你将现有的模块前缀修改为唯一的标识符避免在引入多组件时造成命名冲突。如果选择修改了前缀,那么同时也会修改settings.gradle和build.gradle文件。
  • update-script - 按照CUBA平台的命名规范和目录结构创建更新数据库的SQL脚本文件。CUBA平台会在应用启动的时候有相应的机制来执行这些脚本,脚本会按照创建的时间顺序执行,从最老的到最新的。所以为了保证这种顺序,脚本存放的目录和文件名有特殊的规范:目录是 modules/core/db/update/{USED DATABASE}/{yy}/,文件名按照 {yyMMdd}-{INCREMENT}-{SCRIPT NAME}.sql 的格式。
  • custom-template - 从开发者定义的Apache Velocity模板文件生成项目文件。通过模板机制可以无需编译而通过声明式的方式扩展CLI命令。从这里了解更多的CLI模板引擎功能。
  • change-prefix - 在开发add-on的时候可以通过这个命令修改模块的前缀,以避免add-on在集成是发生命名冲突。
  • premium-repo - 在项目的build.gradle中添加 premium 仓库。
  • idea - 通过Intellij IDEA 打开项目。

从上面这些功能可以看出来,CLI在开发过程中为开发者承担了很多不可避免的繁琐的工作。

可扩展性

首先,上面已经提到了,CLI提供了模板引擎,可以不需要更改CLI的源码,不需要编译,只通过配置来扩展CLI的命令。CLI模板由下面两部分组成:

  1. _template.xml_文件,里面声明了一些自定义命令需要询问的问题。
  2. 一组文件(xml,java,或者其他格式),里面有Apache Velocity脚本,所以可以通过Velocity模板引擎处理。template.xml 里面问题的答案会以参数的方式传递给Velocity脚本。

这个wiki 网页详细介绍了CLI模板。

其次,CLI也提供了自定义插件的接入点,可以加载自定义插件并且将CLI事件返回给插件进行处理。通过这个机制,开发者可以创建自己的新命令或者扩展已有命令,因而具有极大的灵活性。例如,可以给screen命令添加另一个选项,比如lookup。这里有文档和CLI插件的开发向导。

最后,CUBA CLI也是开源项目,可以在GitHub上找到源码。

结论

以上谈到的这些只是CLI的起点,我们希望CLI能使得开发过程更加熟练,更加快速,特别是在不使用CUBA Studio的情况下。接下来,我们会进一步提升CLI的能力,并且已经有roadmap了。里面有第二版将要添加的功能。

作为本文的结论,我想分享一下个人的建议。如果用CLI开启你的第一个CUBA项目的话,不是那么容易理解和评估平台的能力。CUBA Studio有30天免费试用,所以如果你或者你的同事对平台很陌生,建议使用CUBA Studio作为入口,在Studio中对平台进行操作和理解平台的功能。然后在免费试用结束后,再决定是要继续购买Studio还是说可以直接用CLI了。

最后,可以在youtube观看CLI demo。

P.S. 噢,差点忘了提一句,CLI是用Kotlin写的,这是我们第一次把这个语言用在了生产环境,目前看还不错!