SuperAPI AI 工具集

monorepo-management

部署与运维

查看项目

更新于 10-16 08:31

技能介绍

用途

Monorepo Management 用于构建高效、可扩展的单体仓库(monorepo),支持在多个包和应用之间共享代码、统一工具链并实现原子化变更。该技能适用于以下场景:搭建新的 monorepo 项目、从多仓库迁移到单体仓库、优化构建与测试性能、管理共享依赖、实施代码共享策略、为 monorepo 设置 CI/CD、进行版本管理与包发布,以及调试 monorepo 特有的问题。

核心概念

采用 monorepo 的优势包括:共享代码与依赖、跨项目原子提交、一致的工具与规范、更便捷的重构、简化的依赖管理以及更好的代码可见性。同时存在挑战:规模化下的构建性能、CI/CD 复杂度、访问控制以及体积庞大的 Git 仓库。

主要工具

包管理器方面:推荐 pnpm workspaces,另可选 npm workspaces 与 Yarn workspaces。构建系统方面:多数场景推荐 Turborepo,Nx 功能丰富但较复杂,Lerna 较旧且处于维护模式。

使用方式

初始化 Turborepo 项目可执行 npx create-turbo@latest my-monorepo 并进入目录。典型结构包含 apps/(如 web 为 Next.js 应用、docs 为文档站点)与 packages/(如 ui 为共享 UI 组件、config 为共享配置、tsconfig 为共享 TypeScript 配置),根目录包含 turbo.json 与根 package.json。

turbo.json 中通过 pipeline 定义任务:build 依赖 ^build 并输出 dist/、.next/(排除 .next/cache/);test 依赖 build 并输出 coverage/;lint 无输出;dev 不缓存且持久运行;type-check 依赖 ^build 且无输出。

根 package.json 中设置 private 为 true,workspaces 为 ["apps/", "packages/"],并提供 build、dev、test、lint、format、clean 等脚本,devDependencies 包含 turbo、prettier、typescript,并声明 packageManager 为 pnpm@8.0.0。

子包(如 packages/ui)的 package.json 展示 name、version、private、main、types、exports(可导出 "." 与 "./button")、scripts(build、dev、lint、type-check)以及 devDependencies 与 dependencies 的写法,其中使用 workspace:* 引用内部共享包。

更详细的模式与示例位于 references/details.md。

最佳实践

一致版本:在工作区内锁定依赖版本;共享配置:集中管理 ESLint、TypeScript、Prettier 配置;依赖图:保持无环,避免循环依赖;有效缓存:正确配置 inputs/outputs;类型安全:在前端与后端之间共享类型;测试策略:包内做单元测试,应用内做端到端测试;文档:每个包提供 README;发布策略:使用 Changesets 进行版本管理。

常见陷阱

循环依赖(A 依赖 B、B 依赖 A)、幽灵依赖(使用未声明在 package.json 中的依赖)、错误的缓存输入(Turborepo inputs 缺失文件)、过度共享(本应分离的代码被共享)、共享不足(代码在多个包中重复)、大型 monorepo(缺少合适工具时构建变慢)。

发布包

使用 Changesets 的流程:执行 pnpm add -Dw @changesets/cli 与 pnpm changeset init 初始化;用 pnpm changeset 创建变更集;用 pnpm changeset version 进行版本更新;用 pnpm changeset publish 发布。GitHub Actions 中可使用 changesets/action@v1,设置 publish 为 pnpm release,并配置 GITHUB_TOKEN 与 NPM_TOKEN。