@conformetry/generation

中文文档
0.0.78发布于 2026/11/10MITTypeScriptES Module构建来源已验证近 30 天下载 9793

Confometry 的模板渲染和文件生成运行时间

中文使用文档
文档目录12 节
  1. 使用量
  2. 钩子
  3. 二. 背景情况
  4. 从钩上写入
  5. 格式列表
  6. 当钩子扔出
  7. 渲染
  8. 适配器
  9. 出口
  10. 测试
  11. 许可证
  12. * 调和

相会生成

npm

生成运行时间 调和: 移动模板树,制作每个路径和每个文件,并写入 结果.

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

许可证

麻省理工学院——见 自由主义。 。 。 .

* 调和

这个项目源于 巢-服务-项目 符合模板.

版本与发布记录

@conformetry/generation 共发布 76 个版本,首次发布于 2026/10/05;过去 12 个月发布了 76 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.0.78latest2026/11/10今天
0.0.772026/11/10今天
0.0.762026/11/091 天前
0.0.752026/11/091 天前
0.0.742026/11/091 天前
0.0.732026/11/082 天前

关于 @conformetry/generation 的常见问题

@conformetry/generation 是什么?

Confometry 的模板渲染和文件生成运行时间

如何安装 @conformetry/generation?

在项目目录运行 npm install @conformetry/generation,或使用 pnpm add / yarn add / bun add。

@conformetry/generation 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@conformetry/generation 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@conformetry/generation 可以商用吗?

@conformetry/generation 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@conformetry/generation 的下载量有多少?

根据 npm 官方下载统计,@conformetry/generation 在 2026/10/11 – 2026/11/09 这 30 天内被下载 9,793 次,日均约 326 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@conformetry/generation 还在维护吗?

最新版本 0.0.78 发布于 2026/11/10(今天);至今共发布 76 个版本,其中过去 12 个月发布了 76 个;首次发布于 2026/10/05。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。