pnpm workspace 是 pnpm 内置的 monorepo 解决方案,用于管理多个包在一个仓库中。
基本配置:
yaml# pnpm-workspace.yaml packages: - 'packages/*' # 所有 packages 目录下的包 - 'apps/*' # 所有 apps 目录下的应用 - 'shared/*' # 共享模块
项目结构示例:
shellmy-monorepo/ ├── pnpm-workspace.yaml ├── package.json ├── pnpm-lock.yaml ├── packages/ │ ├── ui/ │ │ ├── package.json │ │ └── src/ │ └── utils/ │ ├── package.json │ └── src/ └── apps/ ├── web/ │ ├── package.json │ └── src/ └── server/ ├── package.json └── src/
包间依赖引用:
json// apps/web/package.json { "name": "@my-org/web", "dependencies": { "@my-org/ui": "workspace:*", // 使用 workspace 协议 "@my-org/utils": "workspace:^1.0.0" } }
workspace 协议类型:
json{ "dependencies": { "package": "workspace:*", // 使用最新版本 "package": "workspace:^", // 兼容版本 "package": "workspace:~", // 近似版本 "package": "workspace:^1.0.0" // 指定版本范围 } }
常用命令:
bash# 安装所有依赖 pnpm install # 在特定包中运行命令 pnpm --filter @my-org/ui build pnpm -F @my-org/ui build # 简写 # 在所有包中运行命令 pnpm -r build # 递归执行 # 只在有变化的包中运行 pnpm -r --filter "...[origin/main]" build # 添加包间依赖 pnpm --filter @my-org/web add @my-org/ui
优势对比:
| 特性 | pnpm workspace | Lerna | Yarn Workspaces |
|---|---|---|---|
| 内置支持 | ✅ | ❌ 需安装 | ✅ |
| 依赖共享 | ✅ 硬链接 | ❌ | ✅ 符号链接 |
| 磁盘效率 | 最高 | 一般 | 中等 |
| 配置复杂度 | 简单 | 复杂 | 简单 |
最佳实践:
bash# 使用 changesets 管理版本 pnpm add -Dw @changesets/cli pnpm changeset init # 发布流程 pnpm changeset # 记录变更 pnpm changeset version # 更新版本 pnpm -r publish # 发布所有包