JHipster 7.8.1 Blueprint如何覆写基础生成器模板新增自定义文件
你当前采用的全量复制files.js的方案虽然可以正常运行,但维护成本很高,后续升级JHipster基础版本时必须手动同步files.js的全量变更,很容易出现兼容问题。JHipster 7.x 原生已经提供了更轻量的Blueprint扩展能力,完全不需要复制全量基础生成器配置,即可同时支持原有模板覆盖、自定义文件新增的需求。
推荐实现方式
模板自动覆盖能力
JHipster 7.x 生成器加载模板时,会优先扫描Blueprint目录下的模板路径,只要你在Blueprint中保持和基础生成器完全一致的模板相对目录结构,同名模板会自动替换原生模板,不需要修改任何文件注册逻辑。
比如你要修改SecurityConfiguration_reactive.java.ejs,只需要把修改后的模板按基础生成器的相同路径,放在自己Blueprint的generators/server/templates/对应目录下即可,基础生成器执行时会自动优先使用你的自定义模板。增量新增自定义文件
不需要重写整个serverFiles配置,只需要在writing阶段,在调用完基础生成器的默认写入逻辑后,单独传入你新增的文件配置即可。参考代码:get writing() { return { // 先加载基础生成器的默认文件写入逻辑,不用自己维护全量serverFiles ...super._writing(), // 写入自定义新增的文件 writeCustomFiles() { const customFiles = { customModule: [ { path: 'src/main/java/package/config/', templates: ['CustomSecurityHandler.java', 'CustomRoutes.java'] } ] }; this.writeFilesToDisk(customFiles, this, false, this.javaDir); } }; }所有优先级除了你自定义的增量逻辑,都可以直接委托给基础生成器,不需要额外处理。
小粒度模板修改优化
如果你只是需要给SecurityConfiguration_reactive.java.ejs新增少量路由规则,甚至不需要复制整个模板文件,可以在postWriting阶段直接对生成后的文件做内容插入,维护成本更低:get postWriting() { return { addCustomSecurityRules() { const configPath = `${this.javaDir}config/SecurityConfiguration.java`; // 在指定代码段后插入自定义路由规则 this.patchFile(configPath, { after: '.pathMatchers("/api/public/**").permitAll()', insert: '.pathMatchers("/api/custom-open/**").permitAll()' }); } }; }这种方式下,后续升级JHipster版本只要原生模板的锚点代码没有变动,自定义逻辑就可以直接复用,不需要同步模板变更。
方案选型参考
- 如果你只是修改少量模板、新增少量文件:直接用原生模板自动覆盖+增量新增文件的方案即可,不需要复制全量
files.js,版本升级成本最低。 - 如果你需要对生成逻辑做大规模重构(比如你提到的前端全量重构场景):再考虑复制全量
files.js自定义的方案,把所有生成逻辑收敛到自己的Blueprint中。 - 如果你只是给原有文件加几行代码:优先用
postWriting阶段的文件补丁方式,不需要维护整个模板文件。
内容的提问来源于stack exchange,提问作者Dwaraka

