* 调和
脚手架从模板中取出,再将结果握住.
Confometry 是一个代码生成工具链,其模板在之后继续工作 生成。 生成新模块的模板文件夹是: 说明随后对模块进行检查,因此脚手架公约 执行它们是一件艺术品 而不是两件分开的东西.
npm install --save-dev @conformetry/cli
# Scaffold a new module from the `nestjs-service-module` template
conformetry generate --config configuration/conformetry.config.ts --template nestjs-service-module --name billing
# Check every existing instance still matches the template it came from
conformetry validate --config configuration/conformetry.config.ts
为什么
脚手架工具停止关心文件写出的时刻. 一个月后
模块已丢失 constants.ts,一个服务放弃了它的章节评论,
没有人会注意到 直到有人读它。 林特斯帮不了忙——会议
不是关于语法的规则 而是关于模板形状的规则
存在于生成器输出目录中.
相会相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相相接相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 模板被二次渲染:一次创建 并用同样的渲染器取而代之 比较已有的文件 。 不是一个文件 重新生成它今天的写法是一个发现.
比较是 结构而非文字。将类型脚本实例与
语法树, 标记为 mdast 树, Python 通过 Python 自己的 ast
模块。 重写文件、重命名本地文件或添加方法不会失败
校验; 删除所需的导出、 丢弃已声明的文件或丢失文件
页:1.
安装
| 软件包 | 何时安装 |
|---|---|
@conformetry/cli | 你想买吗 conformetry 命令 |
@conformetry/nx | 您的工作空间为 Nx 单曲 |
@conformetry/generation + 键 @conformetry/validation | 你在自己的工具中嵌入符合 |
npm install --save-dev @conformetry/cli
# or
pnpm add --save-dev @conformetry/cli
节点.js20或更新. 验证 Python 或 Jupyter 实例的额外需求
python3 打开 PATH —— Python 验证器通过解释器比较
拥有 ast 模块,而不是重用解析器.
图标
conformetry generate
将一个模板文件夹放入目标目录.
| 旗帜 | 目的 |
|---|---|
--template [name] | 哪个模板来自登记册 。 省略时询问 |
--config <path> | 要读取的配置文件 。 需要: 没有它就拒绝运行, 没有搜索文件名 |
--directory [path] | 在哪里写文件? 需要: 拒绝运行 |
一个空白 --config 被拒绝 @conformetry/configuration 带有
ConfigurationPathRequiredError 名称 --config 旗帜; 指挥官拒绝
之前少了一个.
模板本身的输入作为旗子随这些:
conformetry generate --config configuration/conformetry.config.ts --template react-component-folder --name search-bar
选择 --template 在终端提供一个拾取器 - 一个自动完成结束
每个已配置的模板, 每个模板都有其描述, 过滤为您
类型。 一个名字像 nestjs-service-module 设计很长,打字很长
service 就是因为这样,才便宜到手,谁也不能跑
conformetry templates 找一个上去。 通过 --template 跳过拾取器
完全,因为提供一个值 本身是一个呼叫者选择退出
问.
没有终端, 缺少模板 拒绝 - 列出所有可用的 名字,而不是等待,所以CI工作 立即失败而不是被吊死 直到时间流出.
--generator 被删除而不是作为别名保留传递它
拒绝的名字。 在此接受未知的旗帜, 以便模板自己的输入
作为旗帜传出,这意味着指挥官会读 --generator 作为
任何输入都不要默默地宣布和放弃它——“出现工作”
重新命名是为了避免.
未知的旗帜被有意接受. 哪些投入存在直到
选择了模板,因此它们与模板的图案匹配
而不是提前宣布。 这也是选择模板的原因
与 --template 没有 --name: 几乎每个模板都使用 name,以及
保留这面旗帜是无法供应的.
当 stdin 是一个终端时, 就会提示缺少输入,还有 没有旗子可以关闭它——一个附属的终端是整个条件,所以一个 剧本,钩子,或者CI任务从没有被提示.
每一个输入都需要一个模板声明. 每个模板替代
的占位符,并须使缺失的为空字符串
而不是失败,所以一个可选的输入会悄悄地产生一个洞
已生成文件 . nx g conformetry:<template> 始终如此
命令现在也这样做,所以同一模板要求获得相同的值,以
运行的方式.
由于没有终端,所以缺少输入 拒绝 ——将国旗命名为:
通过——跑出非零. 这种拒绝是负载的一半.
prompts 不失败于非致命的结节: 它绘制菜单, 永远不会
解决,并让进程 0 出口未产生任何结果,这就是如何
这个命令曾经挂在CI中. 它现在声称有一个终端,然后催促
并报告一个被拒绝的命令行.
conformetry templates
将装入的配置声明的每个模板及其描述命名
和文件夹. generate 财务报告和审定财务报表 validate 两人现在都把名单作为选手
此命令用于读取, 而不是在打字前查找姓名
一个.
| 旗帜 | 目的 |
|---|---|
--config <path> | 要读取的配置文件 。 需求 |
--instances [globs] | 逗号分隔路径或软块; 只报告解释它们的模板 |
--json | 将列表写入 JSON |
与 --instances 它回答另一个方向——模板解释a
给定路径 :
conformetry templates --config configuration/conformetry.config.ts --instances packages/billing/src/modules/billing
nestjs-service-module (nsm)
Generate a NestJS service module
Template: configuration/conformetry-templates/nestjs-service-module
Instances:
packages/billing/src/modules/billing 5/5 files 100%
nestjs-command-module (ncm)
Generate a NestJS command module
Template: configuration/conformetry-templates/nestjs-command-module
Instances:
packages/billing/src/modules/billing 3/5 files 60%
列出每个解释路径的模板,因为路径可以属于 到一个以上。 没有任何记录显示一个案例来自何方——归属 从一个模板的结构中推断出路径已经有多少——所以 单项判决会掩盖使案件含糊不清的领带.
赤裸的列表省略了实例; 它们只在您按路径缩小时出现, 所以 登记簿仍可读取.
conformetry instances
列出所配置的 globs 找到的每一个实例, 并列出每个模板 一个 上面命令的补充: 该命令询问路径的标准 答案,此选项询问生成的代码是否存在 .
conformetry instances --config configuration/conformetry.config.ts --templates nestjs-service-module
packages/billing/src/modules/billing
Templates:
nestjs-service-module 5/5 files 100%
| 旗帜 | 目的 |
|---|---|
--config <path> | 要读取的配置文件 。 需求 |
--json | 将列表写入 JSON |
--templates [names] | 逗号分隔模板名称; 只报告它们解释的示例 |
打印的每个路径都可以作为 --instances 上面的论点,所以两者
编曲不重塑. --templates 你是如何发现每一个实例a
模板更改将产生影响.
请注意 项目标签 而不是表白是无形的 这里:标记分辨率属于 Nx 插件,命令行主机定位 仅用缩写即可.
conformetry validate
扩展所配置的示例并比较其发现的与 生成的模板.
| 旗帜 | 目的 |
|---|---|
--config <path> | 要读取的配置文件 。 需求 |
--instances [globs] | 逗号分隔的块以验证, 压倒配置 |
--languages [names] | 要运行的逗号分隔语言 - typescript, (中文(简体) ), markdown, (中文(简体) ), python, (中文(简体) ), json, (中文(简体) ), jupyter, (中文(简体) ), text |
--templates [names] | 以逗号分隔模板名称来缩小运行范围,或 all 每张 |
--threshold [ratio] | 符合度最低的得分可能为0比1。 三个阈值中的最弱者 |
每个旗帜,但是 --config 是可选的;缺漏的过滤器表示"一切". 命令输出
当任何实例的得分都低于其阈值时,非零,因此
用作出场前的大门.
--templates 财务报告和审定财务报表 --instances 是两个独立的过滤器运行
是它们的相交点——在模板之前将候选人从一边删除
和实例对齐:
--instances | --templates | 验证的 |
|---|---|---|
| 缺席 | all,或者没有终端的缺席 | 每个模板对应每个配置实例 |
| 当前 | all,或者没有终端的缺席 | 以每个适用模板为例的缩写 |
| 缺席 | 名称 | 每一个属于这些模板的事例,都与之相对 |
| 当前 | 名称 | 缩写为模板实例 |
选择 --templates 在一个终端提供相同的拾取器 generate 已经,
选中多个 all 提供与名字。 没有终点站
它回到每一个模板,而不是问——这恰恰是一个
引用此旗帜之前已经做了, 因此脚本和 CI 工作是
不受影响. all 保留: 配置无法声明模板
那个名字.
无法找到实例被项目标记所覆盖的模板
这个主机,而缩小的运行是这样说的,而不是报告什么也没有发现。 A 类
携带的团体 tags 读取它的光彩 在每个工程中选择标签这样
src/modules/* 除非项目根被加入其中,否则毫无意义
只有拥有项目图的主机才能做到. 这种群体被排除在外,而不是
从工作目录中扩展,使其与所发生的情况相匹配
坐在同一个相对路径上,对照标定到其它的模板来测量它
项目。 运行这些通过 @conformetry/nx, (中文(简体) ),
或通过 --instances 并检查路径.
命名一个不存在的模板 拒绝列出真实姓名, 而不是无声地缩小为一无所有。 匹配无的选择 实例报告为 "没有事件属于..." 而不是一个干净的 报告,所以除了"所有检查"之外,可以告诉"没有检查".
分数
审定报告 多少钱 而不是仅仅 无论它是否如此。 每个模板元素 比较重是一 和缺失的元素 花费整个子树 它代表,所以 删除一个类的成本远远大于放弃一个导入, 没有任何人 保持一个加权表.
每个级别都报告同一三个数字——达到的总数和百分比:
Conformance scores:
✗ projects/common/observability/src/modules/logger (nestjs-service-module) — 149/151 requirements met (98.7%), below threshold 100.0%
✗ projects/common/observability/src/modules/logger/logger (nestjs-service-file) — 108/109 requirements met (99.1%), below threshold 100.0%
Total — 257/260 requirements met (98.8%) across 2 instance(s), 2 below threshold
1. file: logger.types.ts — 1/2 requirements met (50.0%)
Instance: projects/common/observability/src/modules/logger/logger.types.ts
Template: configuration/conformetry-templates/nestjs-service-module/{{nameKebabCase}}/{{nameKebabCase}}.types.ts
1. Missing comment // 🏷️ Types
Template: Line 1, Column 1
Expected: `// 🏷️ Types`
Weight : 1 of the 2 requirements in this file
Fix : Add the comment // 🏷️ Types to the instance file.
| 职等 | 答复 |
|---|---|
| 文件 | 多少钱 此文件 被漂移的——一个小文件可能会因为一个发现而失去一半的自身 |
| 实例 | 此实例是否澄清其阈值; 这是适用于 |
| 共计 | 整个运行是如何做到的,跨越每一个实例/模式对 |
该分数与百分比一并打印,因为百分比隐藏其 比例表:99.3%读取相同,无论缺少151个要求,或 有三万四千个,只有第一个是5分钟.
总数按实例/模板对数而不是文件计算。 文件 由两个模板管理,两者都欠,所以它的要求是真实的 每个模板计算一次.
一个比自己更符合事实的发现是这样说的,这就是: 昂贵的漂移 成员,它持有.
实例得分必须达到或超过 阈值 以通过。 默认是
1 完美配对,这是守法者一直要求的,所以
添加分数后,任何变化都不会被故意降低.
三层设置,最窄第一:
| 职等 | 何处 | 适用于 |
|---|---|---|
| 实例组 | instances[].threshold | 只有组合的 globs 定位路径 |
| 发电机 | threshold 在生成器上 | 模板的每一个实例 |
| 运行 | --threshold | 每一次运行触碰 |
这就是采用一个可承受的模板的原因。 新模板可以是
通过,但目录仍然保存到 0.75 时
更别提了,别把事情搞砸
工作空间改变一次.
任何一种方式的发现。 一个更低的门槛是允许运送漂流, 也没有理由停止展示.
差异按文件分类,每个文件的地址在 两者 方——当实例错误且模板如此说的地方——加上 预期价值和具体的固定:
1. file: billing.service.ts
Instance: packages/billing/src/modules/billing/billing.service.ts
Template: configuration/conformetry-templates/nestjs-service-module/…
1. Missing required comment
Instance: line 24
Template: line 31
Expected: `// 🌎 Public Methods`
Fix : Add the `// 🌎 Public Methods` section comment above the first public method.
这个 fix 字段是格式的要点:报告意在可采取行动
由任何人——或任何东西——使文件符合规定.
配置
单人 conformetry.config.ts 宣布每个生成器: 模板文件夹
它提供,它需要的投入, 以及它已经占据的路径.
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;
instances 说明发电机在哪里
输出已经存在, 所以验证知道要检查什么而不被告知
两次 完整字段参考——实例组、标签选择器、输入
策略、发现和所支持的文件格式——在
@ confometry/ confignation (帮助)。 。 。 .
模板
一个模板是普通文件的普通文件夹. 文件内容和文件
路径 与 胡子文件夹
名称 {{nameKebabCase}} 变成 billing 和一个名为
{{namePascalCase}}.tsx 变成 SearchBar.tsx数字 :
templates/nestjs-service-module/
└── {{nameKebabCase}}/
├── {{nameKebabCase}}.constants.ts
├── {{nameKebabCase}}.module.ts
├── {{nameKebabCase}}.service.ts
├── {{nameKebabCase}}.service.unit.test.ts
└── {{nameKebabCase}}.types.ts
每个发电机 name 输入扩展为四个案件变体
自动,所以模板从不需要手动转换:
| 占位符 | search bar 变成 |
|---|---|
{{nameCamelCase}} | searchBar |
{{nameKebabCase}} | search-bar |
{{namePascalCase}} | SearchBar |
{{nameSnakeCase}} | search_bar |
同一名称的明确输入总是胜过所衍生的变体. 满 胡子是可用的 – 有 HTML 的段落,倒置的段落,部分 逃避被禁用的已替换值不能损坏源代码 .
提供每个占位符生成时使用的模板 . 一个 插入的占位符未提供
generate与MissingSubstitutionError,命名占位符和模板文件. 胡子会变成空弦.validate换成 读取实例中的值——模板首先使用的文本 占位符——和报告Could not infer {{…}}当什么都没有时 显示它.区域是例外, 以及模板要求什么 选项:
{{#owner}}Owner: {{owner}}{{/owner}}当owner而不是拒绝.
验证器
哪个验证员处理文件由文件扩展决定,只有 正在装入运行所需的软件包 .
| 验证器 | 扩展 | 比较 |
|---|---|---|
typescript | .ts, (中文(简体) ), .tsx | 语法树结构和必要的章节评论 |
markdown | .md | 名称结构——标题、清单、表格,而不是旁白 |
python | .py | 通过 Python 自己的结构 ast 模块 |
json | .json, (中文(简体) ), .jsonc | 关键结构和价值 |
jupyter | .ipynb | 笔记本信封, 将单元格下放到标记下和 Python 验证器 |
text | 其他的都一样 | 重复- 意识线相容性—— 地板, 所以不会不限制扩展 |
在它们运行之前, 模板声明的每个文件都会被检查到
已存在该通行证包括延期,不要求验证人 .gitignore, (中文(简体) ),
.env.default, (中文(简体) ), pyproject.toml - 否则可以删除,而不
失败的一切。 缺少的目录报告一次而不是20次
缺少文件 .
包含 TODO 将它视为一个即时而非文本
收到 所以任何评论都满足了.
Nx 工作空间
@conformetry/nx 是同一地点的第二个主机
运行时间。 它又增加了两个独立CLI无法提供的东西:
- A 类
conformetry-validate在每个项目上推断的目标 持有 实例,因此正在缓存验证并参与nx affected。 。 。 . - 按名称排列的发电机 —— 说
nx g conformetry:nestjs-service-module—— 说 nx 通过虚拟提示输入和写入Tree。 。 。 .
因为那些发电机是 配置相对 而不是软件包, 显示它们的插件在安装时会释放, 而不是 超过已运出 :
{ "scripts": { "postinstall": "conformetry-nx-bootstrap-generators" } }
实例组可能额外通过 Nx 标签选择项目, 并带有其缩写 在每个匹配项目内读取 :
instances: [{ patterns: ["src/modules/*"], tags: ["framework:nestjs"] }];
软件包
共通性是故意分裂的,这样嵌入它并不意味着取决于
在一个CLI. @conformetry/core 是叶子,它不依赖于其他的
图表 —— 和所有其他包都确切地声明它可能进口哪些兄弟姐妹.
主机
| 软件包 | 作用 |
|---|---|
@conformetry/cli | 这个 conformetry 命令:扩展软体、输入提示、打印报告 |
@conformetry/nx | Nx 插件: 推断的验证目标、 标记范围实例、 排放的生成器 |
运行时间
| 软件包 | 作用 |
|---|---|
@conformetry/core | 合同叶:结构差异形状、分数、库存和语文验证合同 |
@conformetry/configuration | 配置加载、模板发现、实例匹配、输入分辨率、占位符渲染 |
@conformetry/generation | 生成器生命周期, 通过配置层渲染每个模板 |
@conformetry/validation | 验证管弦、语言路由、查找分解 |
@conformetry/languages | 每个语言模块, 解决其扩展的外观, 每个声明文件的存在检查, 以及它们共享的区别和评分原始 |
@conformetry/output | 每个渲染目标:验证报告和模板及实例清单 |
语文
@conformetry/languages 每个语言都有一个模块,所有模块都通过
单人 LanguagesModule 表面而非作为单独的包.
| 模块 | 扩展 |
|---|---|
typescript | .ts, (中文(简体) ), .tsx |
markdown | .md |
python | .py |
json | .json, (中文(简体) ), .jsonc |
jupyter | .ipynb |
text | 其他一切的倒计时 |
没什么要紧的 @conformetry/cli嵌入符合性意味着取决于
直接运行时间包 —— CLI 是主机之一, 并且持有否
它的逻辑.
嵌入
两个运行时间都是NestJS提供商,所以一个主机会按其电线的方式给他们供电 其它东西:
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",
});
文件系统和材料访问通过适配器,这就是如何
@conformetry/nx 此运行时间对虚拟时间不变 Tree。 。 。 .
刻意作画 没有 适配器: 验证必须精确替换
如生成,或验证会标出生成器本身的文件
生产.
代理技能
从事符合要求工作的编码代理商的代理技能公布于
@conformetry/agents数字 :
| 技能 | 说明 |
|---|---|
conformetry-generate | 使用符合要求的发电机的模板中的脚手架代码 |
conformetry-configure | 配置 : conformetry.config.ts |
conformetry-validate | 对模板进行结构兼容性检查 |
实例
工作实例和沙盒在
@conformetry/examples - 十二个自成一体
包括模板编写、案件变体、结构比较、漂移探测、发电机钩和Nx集成等实例。 从合规报告得到的代理人可以使用
AGENTS.md 找到解释每个发现的例子.
开始
从源代码运行 CLI :
nx run conformetry-cli:start
之后通过子命令及其旗帜 --数字 :
nx run conformetry-cli:start -- validate --config configuration/conformetry.config.ts --languages typescript
测试
nx run conformetry-cli:vitest
构建
nx run conformetry-cli:build
许可证
麻省理工学院——见 自由主义。 。 。 .
* 调和
这个项目源于 巢js - 命令 - 项目 符合模板.