主题
monorepo
multirepo vs monorepo
multirepo:多仓管理。每个项目都看作是一个 package,每个 package 都是一个独立的代码仓库。monorepo:单仓管理。每个项目都看作是一个 package,但是所有 package 都在同一个代码仓库中进行管理。
pnpm workspace 架构
技术选型多种多样,以
pnpm workspace架构为例。
目录规划
bash
./
└── apps/ # 其他子包目录
├── app-a/ # 子包 A
│ └── package.json
└── app-b/ # 子包 B
└── package.json
└── packages/ # 子包目录
├── package-a/ # 子包 A
│ └── package.json
└── package-b/ # 子包 B
└── package.json
├── .npmrc # 工程级 npm 配置文件
├── package.json # 工程级 package.json
└── pnpm-workspace.yaml # pnpm workspace 配置文件pnpm-workspace.yaml
yaml
packages:
- 'packages/*'
- 'apps/*'package.json
json
{
"name": "vfan-monorepo",
// 工程级别的依赖(公用)
"dependencies": {
// ...
}
}json
{
// @<scope>/<package-name>
"name": "@vfan-monorepo/app-a",
// 子包级别的依赖
"dependencies": {
// ...
}
}统一版本
在工程级
package.json中通过engines字段统一指定 Node.js、npm、pnpm 等工具的版本要求:json{ // 统一版本 "packageManager": "pnpm@<version>", "engines": { "node": ">=<version>", "npm": ">=<version>", "pnpm": ">=<version>" } }如果需要进行严格的版本控制,可通过
.npmrc文件配置开启engine-strict选项:iniengine-strict=true
常用命令
bash
# 执行工程级命令
pnpm --workspace-root [...]
# 或者
pnpm -w [...]
# 执行子包级命令
直接进入子包目录执行命令
# 或者
pnpm -C <sub-package-path> [...]子包相互依赖
json
{
"name": "@vfan-monorepo/app-a",
"dependencies": {
"@vfan-monorepo/package-a": "workspace:*"
}
}