# lerna + pnpm workspace
# 为什么要组合使用
在 Monorepo 场景里,pnpm workspace 和 lerna 分工很清晰:
pnpm workspace:负责依赖安装、链接、去重、速度优化lerna:负责多包任务编排、版本管理、发布流程
这套组合基本是当前前端 Monorepo 的主流方案之一。
# 目录结构示例
my-monorepo
├─ packages
│ ├─ utils
│ ├─ core
│ └─ cli
├─ package.json
├─ pnpm-workspace.yaml
└─ lerna.json
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 第一步:初始化 pnpm workspace
pnpm-workspace.yaml
packages:
- "packages/*"
1
2
2
根目录 package.json 建议:
{
"name": "my-monorepo",
"private": true,
"scripts": {
"build": "lerna run build",
"test": "lerna run test",
"release": "lerna version && lerna publish from-git"
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
private: true可以避免根包被误发布。
# 第二步:初始化 Lerna
pnpm add -D lerna
npx lerna init
1
2
2
lerna.json 示例:
{
"version": "independent",
"npmClient": "pnpm"
}
1
2
3
4
2
3
4
# 第三步:创建并关联本地包
假设 packages/core 依赖 packages/utils,在 core 的 package.json 中写:
{
"name": "@demo/core",
"version": "1.0.0",
"dependencies": {
"@demo/utils": "workspace:*"
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
然后执行:
pnpm install
1
workspace:* 会自动链接到本地包,不走远端仓库。
# 常用工作流
# 本地开发
# 给指定包安装依赖
pnpm add axios --filter @demo/core
# 全仓批量构建
npx lerna run build
# 只构建某个包
npx lerna run build --scope @demo/core
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# CI 流程
# 只跑受影响包
npx lerna run test --since
npx lerna run build --since
1
2
3
2
3
# 发布流程
npx lerna version
npx lerna publish from-git
1
2
2
# 实战建议
- 包间依赖优先用
workspace:* - 发布前统一执行
build/test/lint independent模式更适合包变更节奏不同的仓库- 把发布动作放到 CI,减少人工误操作
# 小结
pnpm workspace 解决了依赖管理效率问题,lerna 解决了多包版本与发布标准化问题。
两者组合后,Monorepo 的开发体验和发布效率都会明显提升。