遇见CUBA CLI
原文:Meet CLI for CUBA Platform
翻译:CUBA China
CUBA-Platform 官网 : https://www.cuba-platform.com
CUBA China 官网 : http://cuba-platform.cn
众所周知,在软件开发者的世界,特别是Java开发者,充满着键盘狂人,他们宁愿多敲10-15个字符也不愿点击一下鼠标。CUBA的社区也没有例外,所以经常有人问我们,“怎么可以不用CUBA Studio而开始一个新项目呢?” 或者 “有没有免费轻量级的命令行程序能替代Studio呢?”,有的,这里就有个好消息!
免费的CLI真的能替换收费的Studio嘛?
CLI并不是为了替换Studio,他有自己的使命。对于十分熟悉Spring框架,JPA以及CUBA架构的开发者来说,CLI非常有用。并且(很重要哦!),可以让他们很舒服的在黑屏幕灰色字块的环境工作。简单说,cuba-cli是个命令行工具,可以用它来很容易地创建基于CUBA平台的项目。以及,它为CUBA项目的主要工件提供轻量级的脚手架代码,比如entities、screens、services等。
但同时,Studio还是作为CUBA世界入门的捷径,因为它能提供非常直观的用户界面。通过直观的界面,哪怕是没有接触过CUBA的新用户也能很容易的在几分钟内设计他自己的第一个应用程序,而且甚至不需要任何JPA/Spring或者其他底层技术的经验。事实上,对于开发标准的增删查改的应用程序来说,不需要敲一行代码,Studio可以替你完成所有的事情。另外,对于从其他框架生态系统移植到CUBA的人还有习惯了在一个非常舒服的IDE开发的人来说,Studio是个不错的选择。
总结一下,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模板由下面两部分组成:
template.xml 文件,里面声明了一些自定义命令需要询问的问题。
一组文件(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写的,这是我们第一次把这个语言用在了生产环境,目前看还不错!
欢迎关注CUBA 中国公众号
遇见CUBA CLI的更多相关文章
- CUBA China 最新进展
各位关注CUBA平台的朋友,你们好! 距上次发布动态我们又沉默了大概两个月时间,这期间我们一直在翻译CUBA平台的文档.CUBA平台的开发文档相当丰富,所以这需要耗费较多的时间,至少比我们预想的时间要 ...
- 快速应用开发(RAD)平台 - 20 年的演进
过去几年中,现代软件开发的整体环境发生了巨大的变化.对我个人来说,这种变化与宇宙的加速膨胀差不多.第二个千年刚到来时,产业的发展看起来还不是那么快,只是逐步在前进.现在技术发展的复杂度和多样性已经可以 ...
- webpack遇见的坑:Please install 'webpack-cli' in addition to webpack itself to use the CLI.
webpack-cli没被找到: 在webpack4.0之后,需要全局安装webpack-cli, 在全局安装webpack之后,cnpm i webpack-cli -g 在局部使用webpack时 ...
- CURL与PHP-CLI的应用【CLI篇】
CLI的普通应用 什么是PHP-CLI php-cli是php Command Line Interface的简称,即PHP命令行接口,在windows和linux下都是支持PHP-CLI模式的; 为 ...
- NodeJs编写Cli实现自动初始化新项目目录结构
应用场景 前端日常开发中,会遇见各种各样的cli,这些工具极大地方便了我们的日常工作,让计算机自己去干繁琐的工作,而我们,就可以节省出大量的时间用于学习.交流.开发. 注释:文章附有源码链接! 使用工 ...
- 【Azure Developer】Github Action部署资源(ARM模板)到Azure中国区时,遇见登录问题的解决办法
问题描述 在参考文档"使用 GitHub Actions 部署 ARM 模板"一文中,由于是在中国区Azure上操作,所以生产的部署凭证为中国区凭证.当创建工作流时,在登录到Azu ...
- Be Better:遇见更好的自己-2016年记
其实并不能找到好的词语来形容过去的一年,感觉就如此平淡的过了!没有了毕业的稚气,看事情淡了,少了一丝浮躁,多了一分认真.2016也许就是那句话-多读书,多看报,少吃零食多睡觉,而我更愿意说--Be B ...
- .NET Core系列 : 1、.NET Core 环境搭建和命令行CLI入门
2016年6月27日.NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布,社区里涌现了很多文章,我也计划写个系列文章,原因是.NET Core的入门门槛相当高, ...
- 自建git node pm2 (不赘述,就说遇见的问题)
//======================[git]部分 主题部分还是按照网上的办法进行安装. 安装的话 分为两个办法(一个是yum (contos办法) 或者sudo(ubuntu办法) ...
随机推荐
- SQL Server Extended Events 进阶 1:从SQL Trace 到Extended Events
http://www.sqlservercentral.com/articles/Stairway+Series/134869/ SQL server 2008 中引入了Extended Events ...
- Get User CustomNotificationAddresses
select pv.StringValue, * from tbl_Identity i left join tbl_PropertyValue pv on pv.ArtifactId=conv ...
- element ui aside — 侧栏导航菜单移入移出折叠效果
效果如图,移入移出控制折叠,点击按钮后移入移出不可控制折叠. 功能是很简单的功能,不过昨天这块还是弄了小一个小时,所以记录下来. 发现的问题: 模版上el-aside写上@mouseenter无效 解 ...
- Easyui datagrid绑定数据,新增,修改,删除写法
@{ ViewBag.Title = "xw_xsfl"; } <script type="text/javascript"> var editIn ...
- 【BZOJ3238】[AHOI2013]差异
[BZOJ3238][AHOI2013]差异 题面 给定字符串\(S\),令\(T_i\)表示以它从第\(i\)个字符开始的后缀.求 \[ \sum_{1\leq i<j\leq n}len(T ...
- 队列的实现——c++
一.介绍 队列(Queue),是一种线性存储结构.它有以下几个特点:(01) 队列中数据是按照"先进先出(FIFO, First-In-First-Out)"方式进出队列的.(02 ...
- JavaScript把函数作为另一函数的参数
首先说一下这个问题是怎么产生的:今天看排序算法,想要比较不同的排序算法的时间花费. 最简单的时间统计方法是在程序块开始和结束时分别计时,求一下时间差就能得出该段代码的耗时. 如: var foo = ...
- iOS---GCD的三种常见用法
1.一次性代码:dispatch_once 有时候,有些代码在程序中只要被执行一次. 整个程序运行过程中,只会执行一次. - (void)viewDidLoad { [super viewDidLoa ...
- Python小白学习之路(七)—【字典】【字典的功能】【布尔值】
字典(dict) 基本结构: d = {key1 : value1, key2 : value2 } dict = {'} key : value称为字典的键值对. 每个键 key和值value 之间 ...
- iOS-UIView一些坐标和位置方法封装
新建基于UIView扩展类 UIView+wkjFrame,此类是为了方便获取一些基于UIView类UI控件的坐标和位置的简化,直接引用即可 UIView+wkjFrame.h - (CGPoint) ...