相会生成
生成运行时间 调和: 移动模板树,制作每个路径和每个文件,并写入 结果.
npm install --save-dev @conformetry/generation
使用量
import { GenerationService } from "@conformetry/generation";
const result = await generationService.runGenerator({
configurationDirectoryPath: "/workspace/configuration",
definition: {
name: "nestjs-service-module",
templateDirectoryPath: "templates/nestjs-service-module",
},
inputs: { name: "billing" },
instancePath: "packages/billing/src/modules",
});
// → { generatedFilePaths: [...], outputDirectoryPath: "..." }
生命周期是 preGenerate 执行 postGenerate 格式和格式
文件路径已排序 。 列表中钩子被附加的路径
之后的种类.
钩子
生成器可以声明两个运行在生成周围的函数. 这个 钩子示例 运行两者.
| 钩子 | 运行 | generatedFilePaths 持有 |
|---|---|---|
preGenerate | 在写东西之前 | 无: 这是一个空阵列 |
postGenerate | 模板发布后, 格式化前 | 每条路径, 排序 |
每个钩子都有一个 GeneratorHookContext,可以是同步或同步,并且是
等着呢 虎克是纯函数,所以一个配置无法声明它们
JSON, 无法执行函数; 任何 JavaScript 或 TypeScript 配置
能够。 从
@conformetry/configuration,用于再出口 GeneratorHook, (中文(简体) ),
GeneratorHookContext,以及 GeneratorHooks 从 @conformetry/core页:1
配置不需要其他依赖性来键入其钩子.
import path from "node:path";
import type {
ConformetryConfiguration,
GeneratorHookContext,
} from "@conformetry/configuration";
const configuration: ConformetryConfiguration = [
{
hooks: {
postGenerate: async (context: GeneratorHookContext): Promise<void> => {
const receiptPath = path.join(
context.configurationDirectoryPath,
"receipts",
`${context.substitutions["nameKebabCase"] ?? ""}.log`,
);
await context.filesystem.writeFile(receiptPath, "generated\n");
context.generatedFilePaths.push(receiptPath);
},
},
name: "receipt",
templatePath: "templates/receipt",
},
];
export default configuration;
二. 背景情况
| 外地 | 它所持有的 |
|---|---|
definition | 生成器的运行时间定义 : name, (中文(简体) ), templateDirectoryPath, (中文(简体) ), hooks |
input | 按输入名称给出的输入值 |
substitutions | 模板用什么制作:名称变体,然后在它们上输入 |
outputDirectoryPath | 奔跑的地方,恰好是主机通过的地方 |
generatedFilePaths | 以上列举. 这是可变异的, 和什么物得到 |
filesystem | 运行本身的适配器读取和写入 |
configurationDirectoryPath | 宣布生成器的配置文件的绝对目录 |
路径因主机而异 :
outputDirectoryPath财务报告和审定财务报表generatedFilePaths无论宿主是什么 通过了。 在表单的命令行下--directory被授予, 可能是相对的 在Nx下是绝对的.filesystem只有绝对路径. 从configurationDirectoryPath从不从工作目录,所以钩子 动作相同, 但命令已经启动 .configurationDirectoryPath在两个主机下是绝对的,从 实际装入的文件 .definition.templateDirectoryPath是配置的templatePath因此,工作空间关系, 在命令行之下。 在Nx的下面,这是 解决了工作空间根,如此绝对.
没有 replaceInFile 帮手 编辑已提供文件的钩子读取
与 filesystem.readFile,修改文本,并写回.
从钩上写入
写入 context.filesystem没有 node:fs在命令行下
适配器写入磁盘 。 Nx下面写到发电机的虚拟树,所以
写入更改列表中, --dry-run 预览,没有
到达磁盘直到 Nx 冲出 。 写着 node:fs 跳过树: 它
立即登陆,甚至下 --dry-run中,当运行失败时就留下.
只写在工作空间内. Nx 适配器映射一个绝对路径
在工作空间内到树道。 它不能为外面的一条道路这样做,所以
书写被悄悄地重新植入工作空间,而读取
同一路径返回到磁盘。 构建来自
configurationDirectoryPath。 。 。 .
makeDirectory 在 Nx 下什么都不做; 写入文件创建其目录.
通过 Nx 适配器读取先看树, 所以钩子看到文件
之前在同一跑道上进行的.
格式列表
前题收到 context.generatedFilePaths 之后 postGenerateA级
file 所写的钩子不在列表中, 因此按下路径使其格式化 :
context.generatedFilePaths.push(receiptPath);
命令行主机不默认格式, 所以仅该列表 决定运行报告的内容. Nx 主机格式 树, 钩子, 包括它是否被推; 无论如何推它 两个主机都报告相同的文件.
当钩子扔出
运行停止在抛出,错误传播.
| 东道主 | preGenerate 掷出 | postGenerate 掷出 |
|---|---|---|
| 命令行 | 什么也没有写 | 提供的文件 留在磁盘上; 格式不运行 |
| 无 | 那棵树没有动过 | 被渲染的文件坐在树上 nx g 为失败的运行冲出任何一无所有 |
命令行会用堆栈跟踪来打印一个钩子出错并退出非零.
上面没有说是哪个钩子扔的 所以把发电机和钩子的名字放进去
留言。 下 Nx 运行是两个钩子在磁盘上的原子, 但只用于写入
通过 context.filesystem。 。 。 .
渲染
RenderingService 是整个
整个工具链。 生成生成模板以创建文件; 验证
使 不变 用于比较已有文件的模板 。 两者
必须以相同方式替换文件, 或验证会标记生成器的文件
因此,这两方面都未能重新执行.
内容和路径都与
胡子, HTML 逃出已禁用,因此替换
值不能损坏源代码. buildNameSubstitutions 来源
nameCamelCase, (中文(简体) ), nameKebabCase, (中文(简体) ), namePascalCase,以及 nameSnakeCase 从a
单名; 调用者将自己的输入合并到结果上, 所以明确
输入同一键总是获胜.
插图占位符 无人提供加价
MissingSubstitutionError。 。 。 . 胡子会变成空的 字符串,而不是留下符号 可见,并且因为生成和 验证结果完全相同,其中一半的回路丢失了相同的值 同意没有问题。 在比较的两边都有一个洞 这不是一个可以比较的东西, 所以渲染器拒绝. 验证从不使空洞产生: 它读取了缺失的值 例如,如果无法报告,则报告.部分标记可豁免,故意:
{{#field}}财务报告和审定财务报表{{^field}}为: 条件,所以一个缺失的名称是模板要求块是怎样的 跳过或带走。 由空字符串提供的值也是答案—— 只有一个没有的钥匙是洞。 这些都是一个模板说 "可选":以一节相问,入于内.
路径曾经使用过 a __field__ 他们自己的语法, 假设
套接字无法跨文件系统移植。 它们是——和单独的语法
无法从 Python dunder 中分辨占位符, 因此模板传送
__init__.py 取决于 init 永远无法替代.
适配器
文件系统和文件访问通过 FileSystemAdapter 财务报告和审定财务报表
FormatterAdapter,默认为磁盘和禁用。 就是这样
@conformetry/nx 重用此运行时间不变
nx 发生器 Tree刻意渲染 没有 适配器,用于
上面的原因,我们...
出口
GenerationService, (中文(简体) ), GenerationModule,则 DirectoryEntry, (中文(简体) ),
FileSystemAdapter, (中文(简体) ), FormatterAdapter,以及 GeneratorDefinition 类型。 这个
钩子类型重新导出配置 @conformetry/configuration。 。 。 .
测试
nx run conformetry-generation:vitest
许可证
麻省理工学院——见 自由主义。 。 。 .
* 调和
这个项目源于 巢-服务-项目 符合模板.