如何基于文件模板生成Kotlin代码?求类似Angular Schematics的引擎
用模板实现代码生成完全可行,这些工具能帮到你
我完全理解你更倾向于用模板来生成代码的想法——相比于用KotlinPoet硬编码生成逻辑,模板确实直观得多,修改起来也更灵活,不需要每次调整都重新编译CLI工具。直接说结论:这绝对可行,而且有不少成熟的工具可以满足你的需求,甚至有类似Angular Schematics的脚手架引擎。
一、KotlinPoet能不能结合模板?
KotlinPoet本身是基于API的代码生成库,核心是用代码构建抽象语法树,但它并没有内置模板支持。不过你完全可以把它和模板引擎结合起来用:比如先用模板生成部分代码片段,再用KotlinPoet把这些片段组装成完整的类;或者直接放弃KotlinPoet的API,完全用模板引擎来生成代码——后者其实更符合你想要的“修改模板完成生成”的需求。
二、适合代码生成的轻量模板引擎
如果你想要轻量、直观的方案,这些模板引擎非常适合:
- Mustache.java:语法极简,只有占位符和基本的循环/条件,写代码模板几乎没有学习成本。你可以把样板代码写成
UserRepository.kt.mustache,用{{packageName}}、{{entityName}}这类占位符替换变量,然后在CLI里填充参数渲染成最终文件。 - Freemarker:功能更强大,支持复杂的逻辑(比如分支判断、循环嵌套、自定义函数),适合生成结构多变的代码。比如你可以根据用户选择的参数,决定是否生成某个方法或者导入特定包。
- Pebble:现代Java/Kotlin模板引擎,语法接近Mustache但支持更多特性(比如表达式、过滤器),性能也不错,很适合代码生成场景。
三、类似Angular Schematics的脚手架引擎
如果你想要像Angular Schematics那样,支持交互式提问、生成完整项目结构、甚至增量更新现有代码,这些工具可以满足你:
- Yeoman:这是一个通用的脚手架工具生态,你可以用JavaScript/TypeScript编写自己的生成器,定义模板、交互逻辑(比如询问用户类名、包名)、文件生成规则。它的思路和Angular Schematics非常相似,而且生态丰富,有很多现成的生成器可以参考。你甚至可以结合Kotlin的CLI工具,让Yeoman调用你的Kotlin逻辑,或者直接用Kotlin写生成器(借助Node.js的Kotlin绑定)。
四、实操建议
如果你想自己用Kotlin搭建CLI+模板的方案,步骤大概是这样:
- 用Picocli(Kotlin生态最流行的CLI框架)搭建你的命令行界面,接收用户输入的参数(比如
--className、--package)。 - 选择一个模板引擎(比如Mustache.java),把你的样板代码写成模板文件,放在CLI的资源目录里。
- 在CLI逻辑中加载模板,用用户输入的参数填充占位符,然后将渲染后的代码写入指定目录。
这样做的好处是,后续修改样板代码只需要修改模板文件,不需要改动CLI的代码,非常符合你想要的“直观修改”的需求。
内容的提问来源于stack exchange,提问作者Ignacio Ruiz
相关产品推荐
相关产品推荐

