#handlebars #database-schema #generator #codegen #code

bin+lib ctgen

基于 Handlebars 模板和数据库反射的代码生成器

6 个版本

0.1.5 2024 年 8 月 2 日
0.1.4 2024 年 4 月 17 日
0.1.3 2024 年 3 月 18 日
0.1.1 2024 年 2 月 25 日

#200模板引擎

Download history 1/week @ 2024-06-04 99/week @ 2024-07-30 6/week @ 2024-08-06

每月 105 下载

MIT 许可协议

87KB
1.5K SLoC

Crates.io API dependency status build

关于

旨在减少日常操作中重复性任务的代码生成工具。

根据预定义的代码模板和数据库模式生成代码或文本文档。

目前仅支持 MySQL/MariaDB 数据库,并使用 InnoDB 表存储引擎。

代码模板以 handlebars 格式编写,并支持 rhai 脚本。

安装

运行 cargo install ctgen(如果此项目已达到公共 crate 阶段)。

或者,克隆仓库并运行 cargo build --release,然后
target/release/ctgen 复制到您选择的 bin 路径。

或者只需运行 cargo install --path .

要查看一些实际示例,请参阅 ctgen-samples

使用方法

有 3 种操作模式(命令)。

  1. init 命令用于创建新的配置配置文件项目。
  2. config 命令用于管理现有配置配置文件。
  3. run 命令用于在另一个项目中运行生成任务。

免责声明

在任何情况下,都绝对不应该基于你不熟悉的模板运行生成任务!这会带来巨大的安全风险!在使用 ctgen 与你自己没有创建的模板时,你应该在运行任何任务之前仔细阅读和研究代码!Ctgen 可以修改你的本地文件系统,并且具有执行额外shell命令的能力,无论是带用户输入还是不带用户输入!

在任何情况下,都绝对不应该以 root 或任何其他特权账户的身份运行 ctgen!截至编写本文时,ctgen 没有任何机制来预测或防止任何可能的不良后果或危险操作。请谨慎行事,并在尝试运行任何任务之前研究你使用的模板!

创建配置文件

要创建你的第一个配置配置文件,请在你文件系统的某个位置运行 ctgen init

可选地,你可以通过运行 ctgen init <dirname> 在新目录中创建配置文件项目。

要避免被提示配置文件名,请使用 --name 选项:ctgen init --name backend backend_templates

这将创建一个新的配置配置文件项目,并使用相同的名称进行注册。

默认项目布局是

  • 配置文件配置文件:Ctgen.toml。描述配置文件行为、模板和构建目标。
  • 模板目录:assets/templates。包含所有以 .hbs 扩展名的 handlebars 模板。文件名的主要部分是模板名称。
  • 脚本目录:assets/scripts。包含所有以 .rhai 扩展名的 rhai 脚本。文件名的主要部分用于将脚本注册为 handlebars 辅助函数。

管理配置文件

  • 要将现有的配置配置文件添加到注册表,请运行 ctgen config add [path to Ctgen.toml]。如果你在配置文件目录中,你可以直接运行 ctgen config add。可选地,你可以传递 --default 来覆盖你的默认配置文件或 --name my_name 来覆盖配置文件名称。否则,配置文件的名称将用于注册表。
  • 要列出已注册的配置文件,请运行 ctgen config ls。如果列表中的项目以红色闪烁,这意味着配置文件已损坏,配置文件不存在。
  • 要从注册表中删除配置文件,请运行 ctgen config rm profile_name

运行任务

假设你已经设置了有效的配置配置文件(见上文),要运行生成任务,你需要

  • 进入你的项目:cd my_awesome_project
  • 运行 ctgen run
  • 回答提示
  • ???
  • 获得利润

检查 ctgen help run 以获取额外的选项,例如

  • 使用 --profile=flutter 选择除了 default 之外的配置文件
  • 覆盖配置文件设置以 .env 文件、环境变量名称、DSN 字符串或目标路径
  • 使用 --prompt 选项覆盖配置文件提示,例如 --prompt "dummy=1"。在运行期间将跳过使用命令行参数回答的提示。

示例运行

让我们想象你在为你的移动项目生成flutter代码。你的配置文件名为mobile。它不知道你的数据库在哪里,所以你需要手动输入。你选择了生成clients表的代码,并知道配置文件会询问你是否要生成密码重置流程,并添加使用Google的登录。

运行:ctgen run --profile=mobile --dsn="mysql://[email protected]:3306/project_db" --prompt "password_reset=1" --prompt "google_auth=1" clients

配置文件TOML模式

Ctgen.toml文件描述了配置文件的行为,并遵循以下一组规则

  1. 文件中的第一个部分称为profile,这个部分包含以下字段
  • 字段name:默认配置文件名称
  • 字段env-file:当尝试初始化上下文时寻找的env文件名称,通常是.env
  • 字段env-var:在.env文件中寻找的env变量名称,例如DATABASE_CONNECTION;变量的值预期是有效的DSN
  • 字段dsn:如果env-fileenv-var留空,则配置文件可以有一个硬编码的数据库DSN;否则,此字段可以省略或留空
  • 字段target-dir:这是应该包含所有构建目标的目录。在运行生成任务时(ctgen run),它相对于当前工作目录。如果留空,则使用CWD
  • 字段templates-dir:这是包含所有handlebars模板的目录。它相对于包含配置文件的目录
  • 字段scripts-dir:这是包含所有rhai脚本的目录。它相对于包含配置文件的目录
  • 字段prompts:这是一个字符串数组。数组中的每个字符串都必须是后续定义在prompt部分中的有效提示ID
  • 字段targets:这是一个字符串数组。数组中的每个字符串都必须是后续定义在target部分中的有效目标ID
  1. profile部分之后可以有任意数量的prompt部分,通过将提示ID作为点嵌套值分配给部分名称来声明配置文件提示,例如[prompt.dummy]。提示可以有以下字段(属性)
  • 字段condition:可选,包含一个内联handlebars模板,它应渲染1以触发此提示
  • 字段prompt:包含纯文本或内联handlebars模板,它被渲染到用户作为提示文本
  • 字段options:可选,包含一个选项数组或表(对象),用于单选和多选提示,或字符串(用于输入提示),或内联handlebars模板,它渲染一个逗号分隔的选项列表(用于单选和多选提示)
  • 字段multiple:可选,布尔标志,指示多选;默认为false
  • 字段 ordered:可选,表示多选值是否需要排序的布尔标志;默认为 false
  • 字段 required:可选,表示是否接受空值;默认为 false
  1. prompt 部分之后可以有任意数量的 target 部分,通过将目标ID作为点嵌套值分配给部分名称来声明配置文件构建目标,例如 [target.dummy]。一个目标可以有以下字段(属性)
  • 字段 condition:可选,包含一个内联 Handlebars 模板,该模板应渲染 1 以触发此目标渲染
  • 字段 template:包含模板名称的字符串,该模板应以 .hbs 扩展名存在于 templates-dir 目录中。例如 dummybackend/dummy
  • 字段 target:包含应渲染到 target-dir 目录中文件路径的内联 Handlebars 模板。缺失的路径元素将被创建。也可以是类似于 main.rs 的纯文本路径。
  • 字段 formatter:可选,包含一个内联 Handlebars 模板,该模板应渲染一个在目标渲染并写入磁盘后应执行的有效 shell 命令。如果不需要上下文条件参数,也可以是纯文本 shell 命令。注意:唯一可渲染的变量是 {{target}}

注意

  • 如果 rhai 脚本文件名为 op.rhai 且位于 assets/scripts 中,那么您将拥有在 handlebars 模板中可用的 {{op}} 辅助函数
  • Rhai 包含以下附加包:rhai-chronorhai-scirhai-fsrhai-url
  • 如果您的模板文件名为 backend.hbs 且位于 assets/templates 中,要定义使用该模板的目标,请使用 backend 作为模板名称
  • 可用的助手(除了 handlebars 的默认值)包括:{{inflect}} handlebars-inflector{{concat}} handlebars-concat{{datetime}} handlebars-chrono 以及 {{{json}}}(将第一个参数转换为 JSON)
  • 渲染 handlebars 模板时可用上下文的大致情况如下
{
  "database": {
    "name": "db_name",
    "tables": [],
    "constraints": [],
    "metadata": {}
  },
  "table_name": "selected_table_name",
  "table": {
    "name": "selected_table_name",
    "primary_key": [],
    "columns": [],
    "indexes": [],
    "metadata": {}
  },
  "constraints_local": [],
  "constraints_foreign": [],
  "prompts": {
    "dummy": "1"
  },
  "timestamp": "2024-03-18T21:35:09.750752900+00:00",
  "ctgen_ver": "0.1.2"
}

为了调试目的,可以将自己的上下文输出使用 {{{json this}}} 在您的模板中。

致谢

此工具在很大程度上依赖于 handlebars-rustrhai 包。❤️

待办事项

  • 改进错误处理
  • 改进日志记录
  • 改进 database-reflection(添加更多适配器)
  • 改进 lib 布局和导出,并更好地隔离 cli 中的垃圾
  • 更多数据源,不同的上下文结构体和上下文构建器
  • 为重复运行添加导出/导入上下文选项
  • 更多 handlebars 助手
  • 可能通过目标反向工程来更新模板?基于差异?
  • 可能通过 fs 监控在模板更改时重新运行任务
  • 注释和文档
  • init 由于 toml 和 serde 的环形地狱而产生糟糕的提示选项

依赖关系

~29–43MB
~688K SLoC