本文将介绍如何使用 pnpm 及 Monorepo 实现高效的代码构建和发布流程。
什么是 Monorepo?
Monorepo 是一种将多个项目统一放在一个代码仓库中进行集中管理的方式,适用于项目间耦合度高、共享代码较多的场景。
以 Vue 为例,其源码采用 Monorepo 管理模式,代码仓库中包含多个子项目,如 reactivity
、runtime-core
、compiler-core
等。每个子项目拥有独立的 package.json
,可单独安装、运行与测试。
这种管理方式带来的好处包括:
- 便于团队协作:不同团队在同一代码库中开发,统一规范和流程,避免重复造轮子
- 提升代码复用率:子项目间可以直接相互引用,无需通过发布依赖包的方式
- 统一版本与质量控制:更易对各模块进行集中测试、构建与发布,保障整体代码质量
- 降低开发复杂度:避免多仓库切换与依赖同步问题,提高开发效率
构建 Monorepo 项目
-
全局安装
npm install pnpm -g
-
创建 monorepo 仓库:
bash
mkdir monorepo && cd monorepo
pnpm init
- 在根目录下添加
pnpm-workspace.yaml
文件,告诉 pnpm 当前 Monorepo 中哪些目录属于 workspace
makefile
packages:
- "apps/*" 这是存放"业务应用"的地方,通常是最终运行的项目,比如后台、前台、小程序等。
- "packages/*" 这是存放"可复用模块/工具库/组件"的地方,所有 apps/ 中的项目可以直接使用它们。
- 添加项目
bash
mkdir apps && cd apps
# apps-a
mkdir apps-a && cd apps-a
pnpm init
# apps-b
mkdir ../apps-b && cd ../apps-b
pnpm init
- 安装依赖
csharp
// 安装依赖
pnpm install
// 安装包到根
pnpm add xxx -w
// 安装项目到特定项目
pnpm --filter apps-b add name@version -D
具体的可以看文档:pnpm.io/zh/cli/add
- 启动项目
scss
// 不需要进到特定的项目来操作
// xxxx 子项目package配置的name名称
pnpm --filter xxxx start
安装包的原则:
- 一般公共的包都是安装到最外层 ,除了版本原因等需要"覆盖的"则安装到特定的项目里
- 所有的项目都需要package.json,package.json的name一般是以"@"作为开头,比如@falcon-covoy,这块需要改;
apps-a
和apps-b
的package.json
都是单独的,需要提取公共的包到最外层的package.json
- 项目需要完善的部分:Changesets、Semantic-release、Turbopack、Sonar、Commitlint、Sentry报警、Sentry Transcation业务统计等工具