
pnpm Workspaces:Monorepo 管理指南
pnpm 高效的存储模型和工作区支持使其成为 monorepo 的理想选择。
设置
# pnpm-workspace.yaml
packages:
- 'packages/*'
- 'apps/*'
- '!**/test/**'
// package.json (根目录)
{
"name": "my-monorepo",
"private": true,
"scripts": {
"build": "pnpm -r build",
"test": "pnpm -r test",
"lint": "pnpm -r lint"
},
"devDependencies": {
"typescript": "^5.0.0"
}
}
工作区结构
monorepo/
├── pnpm-workspace.yaml
├── package.json
├── packages/
│ ├── ui/
│ │ ├── package.json
│ │ └── src/
│ └── utils/
│ ├── package.json
│ └── src/
└── apps/
├── web/
│ └── package.json
└── api/
└── package.json
跨包依赖
// apps/web/package.json
{
"name": "@myrepo/web",
"dependencies": {
"@myrepo/ui": "workspace:*",
"@myrepo/utils": "workspace:*"
}
}
过滤命令
# 在特定包中运行
pnpm --filter @myrepo/web dev
# 在所有匹配模式的包中运行
pnpm --filter "./packages/**" build
# 连同依赖一起运行
pnpm --filter @myrepo/web... build
# 在变更的包中运行
pnpm --filter "[origin/main]" test
共享配置
// packages/tsconfig/base.json
{
"compilerOptions": {
"target": "ES2022",
"strict": true,
"moduleResolution": "bundler"
}
}
// apps/web/tsconfig.json
{
"extends": "@myrepo/tsconfig/base.json",
"include": ["src"]
}
目录(pnpm v9+)
# pnpm-workspace.yaml
catalog:
react: ^18.2.0
typescript: ^5.0.0
// packages/ui/package.json
{
"dependencies": {
"react": "catalog:"
}
}
pnpm 的内容可寻址存储通过跨项目共享包文件来节省磁盘空间。