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 在 模板引擎
每月 105 下载
87KB
1.5K SLoC
关于
旨在减少日常操作中重复性任务的代码生成工具。
根据预定义的代码模板和数据库模式生成代码或文本文档。
目前仅支持 MySQL/MariaDB 数据库,并使用 InnoDB 表存储引擎。
代码模板以 handlebars
格式编写,并支持 rhai
脚本。
安装
运行 cargo install ctgen
(如果此项目已达到公共 crate 阶段)。
或者,克隆仓库并运行 cargo build --release
,然后
将 target/release/ctgen
复制到您选择的 bin 路径。
或者只需运行 cargo install --path .
要查看一些实际示例,请参阅 ctgen-samples。
使用方法
有 3 种操作模式(命令)。
免责声明
在任何情况下,都绝对不应该基于你不熟悉的模板运行生成任务!这会带来巨大的安全风险!在使用 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
文件描述了配置文件的行为,并遵循以下一组规则
- 文件中的第一个部分称为
profile
,这个部分包含以下字段
- 字段
name
:默认配置文件名称 - 字段
env-file
:当尝试初始化上下文时寻找的env文件名称,通常是.env
- 字段
env-var
:在.env
文件中寻找的env变量名称,例如DATABASE_CONNECTION
;变量的值预期是有效的DSN - 字段
dsn
:如果env-file
和env-var
留空,则配置文件可以有一个硬编码的数据库DSN;否则,此字段可以省略或留空 - 字段
target-dir
:这是应该包含所有构建目标的目录。在运行生成任务时(ctgen run
),它相对于当前工作目录。如果留空,则使用CWD - 字段
templates-dir
:这是包含所有handlebars模板的目录。它相对于包含配置文件的目录 - 字段
scripts-dir
:这是包含所有rhai脚本的目录。它相对于包含配置文件的目录 - 字段
prompts
:这是一个字符串数组。数组中的每个字符串都必须是后续定义在prompt
部分中的有效提示ID - 字段
targets
:这是一个字符串数组。数组中的每个字符串都必须是后续定义在target
部分中的有效目标ID
- 在
profile
部分之后可以有任意数量的prompt
部分,通过将提示ID作为点嵌套值分配给部分名称来声明配置文件提示,例如[prompt.dummy]
。提示可以有以下字段(属性)
- 字段
condition
:可选,包含一个内联handlebars模板,它应渲染1
以触发此提示 - 字段
prompt
:包含纯文本或内联handlebars模板,它被渲染到用户作为提示文本 - 字段
options
:可选,包含一个选项数组或表(对象),用于单选和多选提示,或字符串(用于输入提示),或内联handlebars模板,它渲染一个逗号分隔的选项列表(用于单选和多选提示) - 字段
multiple
:可选,布尔标志,指示多选;默认为false
- 字段
ordered
:可选,表示多选值是否需要排序的布尔标志;默认为false
- 字段
required
:可选,表示是否接受空值;默认为false
- 在
prompt
部分之后可以有任意数量的target
部分,通过将目标ID作为点嵌套值分配给部分名称来声明配置文件构建目标,例如[target.dummy]
。一个目标可以有以下字段(属性)
- 字段
condition
:可选,包含一个内联 Handlebars 模板,该模板应渲染1
以触发此目标渲染 - 字段
template
:包含模板名称的字符串,该模板应以.hbs
扩展名存在于templates-dir
目录中。例如dummy
或backend/dummy
。 - 字段
target
:包含应渲染到target-dir
目录中文件路径的内联 Handlebars 模板。缺失的路径元素将被创建。也可以是类似于main.rs
的纯文本路径。 - 字段
formatter
:可选,包含一个内联 Handlebars 模板,该模板应渲染一个在目标渲染并写入磁盘后应执行的有效 shell 命令。如果不需要上下文条件参数,也可以是纯文本 shell 命令。注意:唯一可渲染的变量是{{target}}
。
注意
- 如果 rhai 脚本文件名为
op.rhai
且位于assets/scripts
中,那么您将拥有在 handlebars 模板中可用的{{op}}
辅助函数 - Rhai 包含以下附加包:rhai-chrono,rhai-sci,rhai-fs,rhai-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-rust 和 rhai 包。❤️
待办事项
- 改进错误处理
- 改进日志记录
- 改进
database-reflection
(添加更多适配器) - 改进
lib
布局和导出,并更好地隔离cli
中的垃圾 - 更多数据源,不同的上下文结构体和上下文构建器
- 为重复运行添加导出/导入上下文选项
- 更多 handlebars 助手
- 可能通过目标反向工程来更新模板?基于差异?
- 可能通过 fs 监控在模板更改时重新运行任务
- 注释和文档
- init 由于 toml 和 serde 的环形地狱而产生糟糕的提示选项
依赖关系
~29–43MB
~688K SLoC