# 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

# 第一步:初始化 pnpm workspace

pnpm-workspace.yaml

packages:
  - "packages/*"
1
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

private: true 可以避免根包被误发布。

# 第二步:初始化 Lerna

pnpm add -D lerna
npx lerna init
1
2

lerna.json 示例:

{
  "version": "independent",
  "npmClient": "pnpm"
}
1
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

然后执行:

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

# CI 流程

# 只跑受影响包
npx lerna run test --since
npx lerna run build --since
1
2
3

# 发布流程

npx lerna version
npx lerna publish from-git
1
2

# 实战建议

  • 包间依赖优先用 workspace:*
  • 发布前统一执行 build/test/lint
  • independent 模式更适合包变更节奏不同的仓库
  • 把发布动作放到 CI,减少人工误操作

# 小结

pnpm workspace 解决了依赖管理效率问题,lerna 解决了多包版本与发布标准化问题。
两者组合后,Monorepo 的开发体验和发布效率都会明显提升。