编码边界
对照已经构建的图形编码本来评估已宣布的规则,并报告打破规则的边缘和周期.
Codependix 绘制了三个层次的图表,没有说明是否
允许形状。 这把文件工具变成大门
三级 – Nx 项目边缘, NestJS 模块边缘, 文件级导入
边缘, 每个语言分别判断, 即使类型脚本和 Python 是
一起导出 fileImports 图表类型.
codependix map --check boundaries --config configuration/codependix.config.ts
为什么不是ESLint规则
@nx/enforce-module-boundaries 读取导入语句,一次一个文件.
它在结构上看不出三个事实:
- 隐性边缘. 一个 Nx
implicitDependencies条目创建 a 没有导入语句可标记的工程图边 .NeighborhoodEdge已携带implicit,所以代码pendix 持有一个事实 林特规则没有 方法到达. - 一个NestJS模块边缘是一个容器事实,而不是来源事实.
NestjsProjectService.exploreProject报告集装箱的解决方案, 所以是一个动态模块,aforRootAsync,或有条件的导入 产生边号import声明表示. - 一个规则可以是关于图表,而不是边缘. 周期,或 project的从属关系,是一个关于形状的语句,以及看到 一次一个文件无法生成 .
这刻意做的事 没有 替换:分层 depConstraints
图中
configuration/eslint.config.ts,哪个
在导入站点上报告行号,以及 dependency-cruiser是因为
no-circular,这已经是此寄存器的文件循环门.
两者相互核对,而不是假定相等。 所有32个
这个仓库的 depConstraints 机械翻译——
onlyDependOnLibsWithTags 是一个 allow 规则, notDependOnLibsWithTags 是一个
forbid 规则,和一个空 onlyDependOnLibsWithTags 是一个 forbid 到达
所有东西——以及 edges: { implicit: false } 所有32个传球,完全就是
ESLint报告他们。 报告没有缩小另一个边:
conformetry-examples → conformetry-cli,由 implicitDependencies
条目后没有导入语句。 自己买的 depConstraint 评论说
不应该存在依赖性,而ESLint也没什么可标注的。 是否这样
是发现还是假阳性是问题 edges 存在以让规则
答话.
规则模式
规则公布于 codependix.config.ts,按下图级键
审判他们.. nestjsModules, (中文(简体) ), nxProjects,以及 fileImports,该巢由
语言为 { typescript, python } 因为没有边缘永远跨越了两者。 A 类
宣布没有规则的关卡 根本不是建造的,这就是守住大门的原因
价格低廉:判断NestJS级别意味着将每个容器都装入
预览模式 .
两种形状和三种——一种进入规则,写作: from编号 :to 与
判决以这样或那样的方式进行,以及 acyclic 规则的范围 nodes数字 :
| 仁爱 | 报告 |
|---|---|
forbid | 源头匹配的边缘 from 以及目标匹配者 to |
allow | 一个边缘离开 from 给任何地方 to 不索赔 |
acyclic | 节点之间的循环 nodes 选择, 默认为每个节点 |
访问规则也可能缩小范围 边 它判断,而不是选择 它选择的节点 :
edges | 法官 |
|---|---|
| 未设定 | 每一个边缘 — 更严格的读取, 和正确的默认 关于项目可能是什么的规则 取决于 |
{ implicit: false } | 仅由导入语句支持的边缘 @nx/enforce-module-boundaries depConstraint 看见了 |
{ implicit: true } | 仅边缘 implicitDependencies 条目声明和不导入回 |
只有 Nx 级别画出一个隐含的边缘;其他级别边缘读取为 明确.
每条规则都有一条 name 以及,可选的,a message 说它为什么存在.
讯息是 附 录 改为生成的句子,而不是替换
它,所以没有一个配置选择的措辞 成本报告规则
开火,两端都开火.
选择器
1个节点形状覆盖了3个词汇,每个字段都包含有光泽的列表
匹配为 path.matchesGlob数字 :
| 外地 | 匹配 | 备查 |
|---|---|---|
id | 节点的标识符 — 工程名称、 文件路径或模块类名称 | 每一级 |
path | 工作空间相对项目根或项目相对文件路径 | nxProjects, (中文(简体) ), fileImports.typescript, (中文(简体) ), fileImports.python |
project | Nx 项目的节点属于 | nxProjects, (中文(简体) ), fileImports.typescript, (中文(简体) ), fileImports.python |
tags | 节点的 Nx 标记; 一个标记匹配即可 | nxProjects |
选择国必须匹配的每一个字段——字段相互缩小.
在一个领域,一个光彩相配就足够了。 选择者命名一个字段
级别不包含匹配 无 而不是一切:a path 规则
对照 NestJS 模块图表评估,该模块没有文件路径,选择
没有模块,而是默默地选择所有模块。 选择者表示否
字段被配置方案拒绝,因为它读取准确
就像打字一样.
两半相接相接
src/modules/boundaries/ 评估规则,对工作空间一无所知:a
BoundaryGraph 并列出一个规则清单, 和违反情况.
src/modules/boundary-check/ 将真正的工作空间变成那些图表
——每关1个适配器,外加周围的管弦.
BoundaryGraph 这是缝合物 故意不是四个真正的
图表类型。 每个适配器平分 a Neighborhood页:1 NestjsModuleGraph,或
导入图,所以规则评价从未看到 @nx/devkit, (中文(简体) ),
@nestjs/core,或 typescript 并且可以再次被提出 没有
触摸一个规则.
BoundaryCheckService.run 四个关卡走入 BOUNDARY_LEVEL_ORDER —— 说
最便宜的第一——和 跳过任何关卡,在构建前没有声明规则
任何东西。这就是让大门负担得起的原因:判断雀巢JS级别
表示在预览模式下启动每个容器,并判断类型脚本级别
意味着建设 ts.Program 每个项目。 一个只声明 Nx 规则的工作空间
两者都不付 每一级还隔离一个项目的失败
因此,一个不会启动的容器被收集为
BoundaryCheckFailure 而其他项目仍然在评判中.
这里的一切都不取决于 @codependix/cli - 东道主打电话来,从不
反向和规则 configuration/codependix.config.ts 这么说,所以
两者不能结束循环.
测试
nx run codependix-boundaries:vitest
* 调和
这个项目源于 巢-服务-项目 符合模板.