QQ 调和配置
配置参考 调和。 。 。 .
@conformetry/configuration 读取寄存器 conformetry.config.*检查
它,并把它变成三个东西 其余的工具链工作从:
生成器注册、实例验证和
已解析的输入 .
npm install --save-dev @conformetry/configuration
大多数消费者从不直接安装这个 @conformetry/cli 财务报告和审定财务报表
@conformetry/nx 两者都取决于它。 输入时安装
配置文件,或者在您自己的一个主机中嵌入相容性 .
配置文件
文件的扩展名可能是 .ts, (中文(简体) ), .mts, (中文(简体) ), .cts, (中文(简体) ), .js, (中文(简体) ), .mjs, (中文(简体) ), .cjs, (中文(简体) ),
.json,或 .jsonc。路径总是以明确的方式通过 — 没有文件名
寻找。 类型脚本和
JavaScript 文件通过加载 吉地语,所以一个
.ts 配置不需要构建步骤, 也可以从工作空间导入 .
路径首先针对当前目录解决,然后针对
工作空间根——通过向上走来定位 pnpm-workspace.yaml 这么说
相对于根的配置路径仍然从嵌入中解析
目录.
文件默认导出a 生成器定义数组。这是一个阵列 而不是按键记录,因为一个生成器的名字已经是一个字段,和一个 记录使名字真实化 在两个地方一次.
import { type ConformetryConfiguration } from "@conformetry/configuration";
const conformetryConfiguration: ConformetryConfiguration = [
{
description: "Generate a NestJS service module",
inputs: {
name: { description: "Module name in kebab-case", type: "string" },
},
instances: [{ patterns: ["packages/*/src/modules/*"] }],
name: "nestjs-service-module",
templatePath: "templates/nestjs-service-module",
},
];
export default conformetryConfiguration;
发电机田
| 外地 | 需求 | 目的 |
|---|---|---|
name | ✅ | 如何处理生成器, 以及其排放的文件名 |
templatePath | ✅ | 模板文件夹,相对于工作空间根 |
inputs | 它的取而代之的值,如 JSON Schema 碎片 | |
instances | 此生成器输出已存在的地方 | |
description | 当主机列出或提示生成器时显示 | |
hooks | preGenerate 财务报告和审定财务报表 postGenerate 函数环绕渲染;见 @conformetry/generation |
两者 inputs 财务报告和审定财务报表 instances 可省略。 两者均无的生成器
一个没有经过验证的固定模板,这是合法的.
被拒绝的
计划失败了 而不是证实什么 并且每一次报告 一个问题:
- 两台发电机同名响应. 一个主机解决第一个 相匹配,所以碰撞不会错误 它使用的地方—— 它默默地阴影, 失去的生成器无法到达 配置 .
- 两台发电机共用 a
templatePath。 。 。 . 验证然后查找实例 两者平等,并报告为无与伦比. - 含有路径分隔符的名称 . 生成器的地址是它的名称 并释放到一个以它命名的文件.
- 密钥计划没有声明 . 生成对象很严格,所以
拼写错误的字段——或
aliases被彻底删除,但被拒绝 而不是剥去衣服 离开阅读 好像它生效. - 非函数的钩子, 或未知的密钥
hooks。 。 。 . A 类 函数的字符串或对象以其钩子命名,以及hooks出于同样的原因, 生成器是: 一个错误的钩子名称 否则会被剥去 钩子不会悄悄跑掉.
实例
instances 是使验证成为可能的原因。 上面写着发电机在哪里
输出已经存在, 因此验证知道要检查什么而不被告知
再来一次.
instances: [
{ patterns: ["packages/*/src/modules/*"] },
{
patterns: ["applications/*/src/modules/*"],
substitutions: { type: "applications" },
},
];
| 外地 | 目的 |
|---|---|
exclude | 工作空间 - 相干光彩的命名路径,这些路径从来不是实例,无论是否应用 tags |
patterns | Globs 查找这个组的例, 工作空间相对 |
substitutions | 为此组提供模板占位符的值 |
tags | 选择该组适用于哪个主机的标签, 未解释 |
threshold | 最低的符合分数 这些例子可能 超过发电机 |
群体存在,因此替代物可以与普通人不同. type 实值 packages 一个
一组路径和 applications 对于另一个,没有通用规则可以告诉他们
分开.
这些替代物的占位符被从实例中读出. 校正使它成为随机的站点, 抓取文本实例 将模板的首次使用控制在哪个位置, 使模板再次生效 与该文本进行比较,并照常加以比较——因此,以后使用时持有不同的文本 是一种普通的区别。 当无配对时, 实例失败
Could not infer {{…}}。 。 。 .name它的变体总是来自 实例路径,这里提供的值总是获胜。 一代没有 实例读取,所以有一个占位符 无人提供仍然提高MissingSubstitutionError看到了吗@conformetry/generation为什么,和 对于一节语法,模板用于使占位符具有可选性.
exclude 丢弃任何自己路径的实例——找到的图案目录,或
文件实例的文件 – 匹配其中的一格, 无论是否
组有 tags它是如何销售或生成代码 生活在真实的
实例, 如 shadcn 组件输出, 不被验证 :
exclude: ["projects/lexico/lexico-web/src/components/ui/**"]。 。 。 .
tags 由这个没有概念的包件携带
主机可以匹配标签. @conformetry/nx
将其读取为 Nx 工程标记并解决每个组的光滑 内部 每个
匹配项目; 另一个主机可以自由读取它们作为其它东西 。 一组
仅命名 tags 合法——它不定位地选择,这就是
模板,尚未需要实例.
目录 globs 相对于文件 globs
两者故意表现不同 不同之处在于 小模板胜于大模板.
- A 类 目录缩写 打开相配的瞄准镜 和最大的相配器 模板获胜.
- A 类 文件阴影 将范围缩小到匹配的文件, 所以模板 准确描述这些文件比描述整个文件更合适 目录.
双文件模板是这样的 nestjs-service-file 可匹配时间
在一个目录中,一个五文件模块模板也声称:
instances: [
{ patterns: ["src/modules/*/*.service.ts", "src/modules/*/*.service.unit.test.ts"] },
];
设置模板的地方
生成一个 文件夹 包含该文件夹, 因此它的实例路径
是文件夹的 父目录数字 : nestjs-service-module 持有 {{nameKebabCase}}/…, (中文(简体) ),
其实例是: …/src/modules。生成松散文件的模板
它的实例路径是这些文件的目录
进去.
阈值
当符合标准分数达到临界值时 对它适用。 3级设置,最窄取胜:
instances[].threshold ?? generator.threshold ?? runThreshold ?? 1
一个未设置的级别保持不变,而不是被默认填充——即
是让一个主机自己 --threshold 到达一个生成器已经
没有意见。 默认 1 只在链末端应用,所以
任何配置都没有悄悄地被覆盖,没有设定等级
安静地对待他们.
{
name: "nestjs-service-module",
templatePath: "templates/nestjs-service-module",
threshold: 1, // strict everywhere by default
instances: [
{ patterns: ["packages/*/src/modules/*"] },
{
patterns: ["applications/legacy/src/modules/*"],
threshold: 0.75, // …except while migrating this one
},
],
}
当两个组找到具有不同阈值的同一实例时 最严格的胜利:没有任何东西能使一个团体比另一个更具体,让 命令决定意味着一个宽大的群体 可以默默地放松酒吧 别人 设置.
投入
每个条目 inputs 是一个JSON Schema碎片。 仅 properties 财务报告和审定财务报表
required 读取——足够知道一个输入的名称,是否必须是
供货,以及劝说的时候要说什么.
用手写作是动词,所以从一个图案库中衍生出来 通常做法:
import { z } from "zod";
function defineInputs(shape: z.ZodRawShape) {
return z.toJSONSchema(z.object(shape)).properties ?? {};
}
inputs: defineInputs({
name: z.string().describe("Module name in kebab-case"),
project: z.string().describe("Parent project name in kebab-case"),
});
数值按顺序解决:先在命令行上传递旗帜,然后
仍然缺少的交互式提示 。 提示被完全跳过
当 Stdin 不是 TTY 或 CI 实值 true,因此缺少输入失败命令
而不是挂起来.
匹配
校验不记录哪个模板生成文件 。 它的工作原理是: 每个实例与每个模板的比分 文档中已有实例,最合适者获胜.
报告两个结果,而不是跳过,因为作者是一个表白 声称这些道路 为: 实例 :
| 原因 | 含义 |
|---|---|
no-match | 没有模板能很好地解释这个实例 |
ambiguous | 两个或两个以上的模板捆绑,所以它们在这里无法区分 |
出口
| 导出 | 目的 |
|---|---|
ConfigurationService | 此层的所有答案: 加载配置文件、 读取模板、 将 globs 扩展为例、 匹配两者、 渲染占位符并解析生成器输入 |
ConfigurationModule | 提供它的NestJS模块 |
ConfigurationPathRequiredError | 被丢弃 ConfigurationService.requireConfigurationPath 对于缺失或空白的路径,请指定调用者在表面通过的旗帜或选项 |
ConformetryConfiguration | 已装入的配置类型—— 将您的配置写为此 |
ConformetryInstanceGroup, (中文(简体) ), ConformetryGeneratorDefinition | 以上各项的外地一级类型 |
GeneratorHook, (中文(简体) ), GeneratorHookContext, (中文(简体) ), GeneratorHooks | 钩子类型,从 @conformetry/core 因此一个配置文件可以从此包中键入它的钩子 |
一个服务和一个模块,没有其他合作者 - 同一对
@callidescope/configuration, (中文(简体) ), @codependix/configuration 财务报告和审定财务报表
@codometer/configuration 出版,所以学习其中之一 教会大家
他们.
外观后面,模板发现,实例发现,渲染,实例
组合,输入解析度在6个单独的文件中保留6个单独的类,
因为他们是六个不同的工作。 他们不是6个切入点
主机必须知道名称: 消费者进口 ConfigurationModule 财务报告和审定财务报表
注射数 ConfigurationService。 。 。 .
是否需要配置路径, 以及拒绝的内容是
在这里决定了,没有别的地方: ConfigurationService.requireConfigurationPath(path, surface)
返回已调整路径或抛出路径 ConfigurationPathRequiredError. 国家行动倡议
通过 the --config flagNx插件通过自己的选项名称;
既不保守秘密,也不传达自己的信息.
装入配置文件是一个任务 ConfigurationService 持有
本身;所有触及路径的事物都是单行交接
拥有它的合作者.
测试
nx run conformetry-configuration:vitest
许可证
麻省理工学院——见 自由主义。 。 。 .
* 调和
这个项目源于 巢-服务-项目 符合模板.