Skip to content

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": {
    // ...
  }
}

统一版本

  1. 在工程级 package.json 中通过 engines 字段统一指定 Node.js、npm、pnpm 等工具的版本要求:

    json
    {
      // 统一版本
      "packageManager": "pnpm@<version>",
      "engines": {
        "node": ">=<version>",
        "npm": ">=<version>",
        "pnpm": ">=<version>"
      }
    }
  2. 如果需要进行严格的版本控制,可通过 .npmrc 文件配置开启 engine-strict 选项:

    ini
    engine-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:*"
  }
}

其他

基于 MIT 许可发布