让你的 TS Monorepo 强制长成深层模块:mattpocock 这条 Skill 别错过

管过 monorepo 的兄弟都懂那种”半夜惊醒”的感觉——随手 import 一下同事的 utils/lib/helper.ts,两周后整个 packages/ 的依赖图就糊成一坨意大利面,refactor 谁都不敢动。

mattpocock 这次把药方直接做成了一条 Claude/Codex 可调的 setup-ts-deep-modules:用 dependency-cruiser 把”深层模块”约定烧成 CI 级的硬约束,谁违反直接报错。

它到底在解决什么

所谓深层模块(deep module)是 John Ousterhout 在《A Philosophy of Software Design》里反复强调的理念:小接口、大实现。每个 package 的”公共面”只有入口文件(index.ts、client.ts 这种根目录文件),子目录里的实现细节对外不可见。这样重构实现层不会引爆上游调用方,code review 也能一眼看明白边界。

四条规则,一份配置搞定

Skill 落地成 dependency-cruiser 的四条 error 规则:

  • 入口边界:外部代码只能 import 包内根目录文件,禁止触碰任何子文件夹。
  • 包内自由:包自己的文件之间怎么 import 都行,不做限制。
  • 测试走入口:<pkg>/tests/ 只能通过入口访问别的包,连自己包的子目录实现都不能直接 deep-link。
  • 无环依赖:经典 ban-cycle,谁都别想靠”反向 import”绕过。

配套的 dependency-cruiser.config.cjs 直接放进仓库 root,CI 一行 npx dep-cruise src 把违规捞出来,比靠 PR review 抽查稳十倍。

为什么值得装

  • 门槛极低:装完 Claude 调 /setup-ts-deep-modules 就能让它帮你生成配置,第一轮跑就能抓到现存的违规,给你一份”考古报告”。
  • 约定可演进:四条规则是基线,团队完全可以再叠加(比如禁止跨 package 类型重复、强制 lib/ 命名等)。
  • 来自 mattpocock:他那条 TS 类型体操视频在 YouTube 上看过的人都知道,他对”该怎么写 TS”的把控是真的到位的,这条 Skill 沿袭了他一贯的精准手感。

怎么上手

clone 仓库,把 skills/in-progress/setup-ts-deep-modules/SKILL.md + dependency-cruiser.config.cjs 拷进你的 monorepo;让 Claude/Codex 跑一下让 AI 帮你按需调整 imports;最后 npx dep-cruise src --validate .dependency-cruiser.cruiser.json 接进 GitHub Actions,从此 PR 里违规 import 直接红 X。

Monorepo 不该是意大利面的游乐场。这条 Skill 给它的不是建议,是边界。


GitHub: https://github.com/mattpocock/skills/tree/main/skills/in-progress/setup-ts-deep-modules


GitHub: https://github.com/mattpocock/skills/tree/main/skills/in-progress/setup-ts-deep-modules

评论区

0 条评论

登录后可评论。

江望 1605 阅读