首页/开发/代码质量与评审速查/架构约束检查(依赖方向)
规范与静态检查65 条

架构约束检查(依赖方向)

用工具固化分层依赖:dependency-cruiser、ArchUnit、import-linter 等可声明允许的依赖方向并断言违规,把架构图变成 CI 里可执行的检查。

架构约束检查是什么

把架构图上的依赖方向变成可执行的断言:分层之间只允许单向依赖、禁止循环依赖、模块边界外不可访问内部实现。dependency-cruiser 面向 JS/TS,ArchUnit 面向 JVM,import-linter 面向 Python。它们把架构决策从文档搬进 CI,让违规在合并前就被拦下。

基本信息

检查目标分层依赖方向 / 循环依赖 / 模块边界 / 命名与注解约束
常用工具dependency-cruiser、ArchUnit、import-linter
执行时机CI 与本地并行执行,违规即失败
规则来源架构决策记录(ADR)中的图形约定

值得固化的检查项

  • 分层方向:api 只能依赖 service,service 只能依赖 repository
  • 禁止循环依赖:任意两个模块之间不得互相引用
  • 边界封闭:模块的外部接口之外不得访问内部包
  • 禁止特定依赖:领域层不得直接引用 Web 框架或 ORM 类型
  • 命名与放置约束:持久化实现必须落在指定包下
  • 公共出口唯一:跨模块引用必须走约定入口,禁止深入内部路径

示例(import-linter)

示例(import-linter)
[importlinter]
root_package = myapp

[importlinter:contract:layers]
name = layered
# 上层只可依赖下层,反之禁止
type = layers
layers =
    api
    service
    repository

[importlinter:contract:no-cycles]
name = no-cycles
type = forbidden
source_modules =
    myapp.service
forbidden_modules =
    myapp.api

工具对照

工具生态特点
dependency-cruiserJS / TS按规则校验依赖,可输出图与违规清单
ArchUnitJVM(Java、Kotlin)JUnit 风格断言,可在测试里跑架构规则
import-linterPython契约式配置,分层与禁止依赖两类规则常用
规则从 ADR 来:先写下「哪些依赖方向是允许的、为什么」,再翻译成断言。这样违规报告能对上当初的决策,评审有客观依据,也避免规则本身随时间失去解释力。
工具 API 会演进:ArchUnit 1.0 起分层规则的入口方法已迁到 Architectures 下,旧写法需要迁移。升级依赖时把架构规则当成测试一起跑一遍,比事后逐个修违规更省事。

易错点

  • 规则与现状差距过大:一次性冒出几百条告警,先圈定新代码范围比全量归零更现实
  • 只画图不落工具:架构约束停留在文档,无人执行也无人核对
  • 边界规则过细:把私有方法与内部包名也写死,重构时规则本身成为阻力
  • 没有违规趋势数据:无法判断治理是否有效,讨论只能凭印象
  • 用工具代替架构讨论:告警通过被当成设计正确,真正的边界取舍无人决策
  • 规则写在个人分支:无法在 CI 复现,架构约束随人员变动而失效

数据来源与参考

  • import-linter 文档、ArchUnit 文档、dependency-cruiser 文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌