使用 pnpm 搭建 Monorepo 仓库

2025-04-29
npm
85

什么是 monorepo

Monorepo 是具有明确定义的关系包含多个不同项目的单个存储库。

我们在公司做项目时,可以将不同仓库的项目,通过 Monorepo 合并到一个仓库中,方便管理。

monorepo-polyrepo.jpg

利用 Monorepo,也可以将一个巨大的单一项目,拆分为功能独立的多个子模块,提高项目维护性。

monolith-modular4.jpg

如何配置 Monorepo

使用 pnpm 配置 Monorepo 非常简单,只需要在项目根目录创建一个 pnpm-workspace.yaml 文件,即可支持 Monorepo。

packages:
  - 'packages/*'
  - 'apps/*'

这表示:

  • packages/ 目录下的所有子目录都是工作空间包

  • apps/ 目录下的所有子目录也是工作空间包

目录空间根据需求定义,没有严格要求。

如何管理多仓库

如果要新建仓库,可以在我们上一步在 pnpm-workspace.yaml 指定的目录下,新建一个文件夹,然后在内部执行 pnpm init,一个新的工作空间就创建成功了。

cd apps
mkdir web-app
cd web-app
pnpm init

典型的Monorepo结构如下:

my-monorepo/
├── pnpm-workspace.yaml
├── package.json
├── packages/
│   ├── shared/          # 共享库
│   │   ├── package.json
│   │   └── src/
│   ├── ui-components/   # UI 组件库
│   │   ├── package.json
│   │   └── src/
├── apps/
│   ├── web-app/         # 前端应用
│   │   ├── package.json
│   │   └── src/
│   ├── mobile-app/      # 移动应用
│   │   ├── package.json
│   │   └── src/
├── scripts/             # 共享脚本
├── docs/                # 文档
└── .gitignore
  • pnpm-workspace.yaml 配置工作空间

  • apps 放引用工程

  • packages 放公共组件、lint等文件

如果管理依赖

安装全局依赖

部分依赖可以安装到全局,所有内部项目公用,保证依赖一致性。

pnpm 可以使用 -w--workspace-root 参数用于将依赖安装到 ​Monorepo 的根目录​(全局)

pnpm add lodash -w

安装工作空间依赖

部分依赖是工作空间独有的,不需要安装到全局,因此需要在当前工作空间安装

方法就是到具体工作空间下安装即可

cd apps/web-app

pnpm add webpack

安装其他空间

Monorepo 的各个空间之间可以互相依赖,使用之前需要先安装其依赖

可以使用 pnpm add <包名>@workspace:*

假设有以下结构

monorepo/
├── packages/
│   ├── utils/       # @repo/utils
│   └── core/        # @repo/core

**@project/core** 中安装 **@project/utils** 作为依赖​:

cd packages/core

pnpm add @repo/utils@workspace:*

这会在 packages/core/package.json 中添加:

{
  "dependencies": {
    "@repo/utils": "workspace:*"
  }
}

结语

至此,pnpm 管理 Monorepo 的方法已经够我们日常使用,其余如发包,一般不会使用,这里就不再赘述。希望对你有用。

原文地址:https://webfem.com/post/pnpm-mono,转载请注明出处