timzaak / blog

8 stars 1 forks source link

代码模版生成工具 #114

Closed timzaak closed 2 months ago

timzaak commented 4 months ago

基于 #113 来看,还是做个代码模版生成工具会更具有价值。

功能需求

可以参考 giter8 来做,但 giter8的问题是只有 Scala 社区在用,其本身是作为 SBT 插件来做的。

  1. 跨平台,跨语言。需要提供一种方案,让各构建工具快速接入,目前想到的是 command line。
  2. 需要提供一种方案,在代码生成完毕后要做代码格式化。这个可以直接做 command line 调用其他指令来解决。
  3. 提供类似 giter8 的项目初始化功能。
  4. 流行 IDE 支持,需要提供 vs code、 IDEA 等主流 IDE 插件,做好代码着色。

以上最后一条最难实现,需要搞定不同文件格式的语法解析, java/kotlin/swift/c/c++/rust/python/js/typescript/html/css 等够花巨量时间去做。

解决方案

  1. 跨平台,跨语言可以采用 Go/Rust 编写 command line。这样分发的二进制包会比较小,启动也快,需要多多考量如何提供方便的参数输入方式。并在各分发平台提供二进制包。
  2. 代码生成完后的格式化,可以通过项目构建方式和格式化配置文件,默认调用相关指令,来做代码格式化。
  3. 项目初始化,主要解决的是:操作 git 下载项目,读取配置文件,让用户填写必要的参数信息,生成项目,并 git init。
  4. template engine 可使用 Liquid 决模版内容替换,这样web 系列的的代码着色相对简单。

后续拓展

  1. 在已生成的文件里,提取注释里的规则并在注释下方,根据参数或刚新生成的文件再生成新的代码片段。
  2. 提供模版库索引库,方便用户提交自己的模版,并能很快的查询到。
  3. 针对 Web 开发,提供 (table schema => 默认变量 + 模版代码) => 数据层、 Service 层、 Controller 层。
  4. add API
timzaak commented 4 months ago

类似产品调研

telosys 有点像。参数是 entity 的概念,能加载自数据库。但模版库索引库是以自己维护为主,其余人为辅。入门有一丢丢门槛,不够友好。Java 语言。 Giter8 是靠近预期的,但和 SBT 深度绑定,目标用户以 Scala 社区为优先。g8Scaffold 应该是核心,因为常用,但是以 SBT 插件形式存在。 TODO: Idea、VS Code 模版功能

我在想,是否是基于 Giter8 来起步,重新架构产品形态?虽然功能都已比较完善,但依赖包、Scala 3、分发等问题还是需要解决。 尤其模版Lib string template,在 Rust 中没有类似包,后续工作量也不小。

timzaak commented 4 months ago

技术选型

最终还是用 Rust 吧,Scala 需要解决 GraalVM 生态下的各依赖库兼容性问题,目前不确定相关生态是否可行。 模版可多个,默认使用 Liquid,后面在追加 stringtemplate 等,方便兼容 giter8。

用户交互

构建模版项目命令行参数参考 https://www.foundweekends.org/giter8/usage.html 项目结构需要改动一下, src/main/g8 => .template。

已有项目模块 Scaffold 命令, 参考 https://www.foundweekends.org/giter8/scaffolding.html

文件内注释 Scaffold 命令, 还需要仔细考量。一个文件可能存在多个 Scaffold。

分发

除了二进制文件外,

  1. Mac Homebrew
  2. Windows 命令行,winget?
  3. Linux,curl 安装脚本

    代码结构要解决的问题

  4. 需要考量全局配置,环境变量注入,用以解决模版选择、 ssh 配置、代理等。
  5. template engine 可多个选择,这个就需要 Rust 动态加载相关类库。
  6. 提供 bin 和 lib 两种产出物,方便其他工具或代码集成。

Quick Start

要先自己用起来,那么直接做 Scaffold 会比较好,后面再补充模版项目,最后代码着色插件。

timzaak commented 4 months ago

商业逻辑

商业上无法成立。没人会为此买单。目前应用场景多作为一个大Web框架下命令行工具中的一部分。

timzaak commented 4 months ago

再衍生一些,就是配置文件模版。但配置文件追求的是覆盖、默认值。

GitHub 也有模版库的概念,可以结合。

timzaak commented 3 months ago

cargo-generate 功能类似, 但依托于 cargo,需要 fork and rewrite,补充项目执行过程中的 template

timzaak commented 2 months ago

AI 代码提示,解决所有问题,整个架构需要围绕AI来做了。