Foxnic-Web 代码生成 (9) —— 文件覆盖与扩展
概述
之前的文档中我们曾多次提及,Foxnic 的代码生成是迭代式的,当表结构变化后,需要重新生成相关的代码。例如某表增加了一个字段,那么对应的表结构元数据需要重新生成。此外,为了维护新加的字段也需要重新生成模块代码。
这个时候,如果模块代码已经被开发人员修改,默认情况下,重新生成代码会覆盖开发人员修改过的代码。为了能够反复生成大多数的模块代码 Foxnic 设计了一套机制,尽可将影响降到最低。
本文中的示例代码均可在 https://gitee.com/LeeFJ/foxnic-samples 项目中找到,本文对照 webfull 项目讲解。
完整示例
Foxnic-Web 项目提供代码生成的完整示例,请大家参考:
######
配置覆盖模式
我们已经了解,代码生成时会生成一些列文件,一旦这些文件被修改,就不可以重新生成。代码生成配置类为开发人员提供了 configOverrides 方法,用于确定每组文件的写入模式。示例代码如下:
@Override
public void configOverrides() {
//文件生成覆盖模式
context.overrides()
.setServiceIntfAnfImpl(WriteMode.COVER_EXISTS_FILE) //服务与接口
.setControllerAndAgent(WriteMode.COVER_EXISTS_FILE) //Rest
.setPageController(WriteMode.COVER_EXISTS_FILE) //页面控制器
.setFormPage(WriteMode.COVER_EXISTS_FILE) //表单HTML页
.setListPage(WriteMode.COVER_EXISTS_FILE) //列表HTML页
.setExtendJsFile(WriteMode.CREATE_IF_NOT_EXISTS); // 扩展文件
}
上面的代码为每组代码文件制定了写入模式,写入模式(WriteMode)包含若干选项:
选项 | 说明 |
---|---|
WRITE_TEMP_FILE | 如果文件已经存在,在边上生成一个 .code 文件 |
COVER_EXISTS_FILE | 如果文件已经存在,直接覆盖原始文件;不存在就创建 |
CREATE_IF_NOT_EXISTS | 如果文件不存在则创建,如果已存在就不处理 |
IGNORE | 完全忽略,不做生成任何代码 |
如果代码已经修改,我们可以考虑使用 WRITE_TEMP_FILE 或 IGNORE 模式。WRITE_TEMP_FILE 会在目标文件边上生成一个与目标文件同名的 .code 文件,可以将 .code 文件中的内容拷贝到已修改的源文件中。
文件覆盖标记
实际的使用中,使用 configOverrides 方法配置源代码的写入模式还是会显的比较麻烦。如果代码生成工具可以自己识别代码是否已经被开发人员修改,这样就会更加方便。智能识别似乎有些困难,但是开发人员可以在文件修改后直接在文件加入一个标记,代码生成工具识别到这个标记时就不会重新生成改文件。
在项目中,我们使用 @version 来作为文件已修改的标记,如图所示,在 Java 中可以这样:
在 Js 文件中可以这样:
在 Html 文件中可以这样:
逻辑扩展
Foxnic 代码生成的原则是让开发人员尽量不修改生成的代码文件,但是业务逻辑的调整又无法回避,那么如何才能调和两者的矛盾呢?
Foxnic-Web 通过业务逻辑扩展文件 xxx_ext.js 文件来解决前端代码修改的问题。针对后端代码,直接修改,尚未有这样的逻辑扩展文件。
开发人员可以为 xxx_ext.js 文件加入 @version 标记,使 xxx_ext.js 文件不再被覆盖。xxx_ext.js 中包含了 form 和 list 两个对象,并且内置了诸多回调方法,开发人员可以将业务逻辑写入这些回调方法中,而不必去修改另外4个前端页面。这样另外四个前端页面就可以反复刷新代码。
xxx_ext.js 文件如何使用,我们此处不做展开,后续章节专门对其进行深入探讨。
小结
本节主介绍了代码生成的覆盖模式,覆盖模式作用域多个文件组成的代码组。为了方便起见,也可以在源码文件中加入 @version 标记使文件免于覆盖。另外,为了尽可能反复生成代码,我们引入了 xxx_ext.js 文件的扩展机制。
相关项目
https://gitee.com/LeeFJ/foxnic
https://gitee.com/LeeFJ/foxnic-web
https://gitee.com/LeeFJ/foxnic-samples