monorepo项目pnpm 的workspace(工作空间)

1,105 阅读2分钟

一、为什么使用monorepo

  1. 随着迭代业务复杂度的提升,项目代码会变得越来越多,越来越复杂,大量代码构建效率也会降低,这种代码管理方式称之为 Monolith(单仓库巨石应用)。

  2. 为了解决这个痛点,我们会将项目拆解成多个业务模块,并在多个 Git 仓库管理,模块解耦,降低了巨石应用的复杂度,每个模块都可以独立编码、测试、发版,代码管理变得简化,构建效率也得以提升,这种代码管理方式称之为 MultiRepo(多仓库多模块应用)。

  3. 随着业务复杂度的提升,模块仓库越来越多,MultiRepo这种方式虽然从业务上解耦了,但增加了项目工程管理的难度,随着模块仓库达到一定数量级,会有几个问题:跨仓库代码难共享;分散在单仓库的模块依赖管理复杂(底层模块升级后,其他上层依赖需要及时更新,否则有问题);增加了构建耗时。于是将多个项目集成到一个仓库下,共享工程配置,同时又快捷地共享模块代码,成为趋势,这种代码管理方式称之为 MonoRepo(单仓库多模块应用)。

image.png

二、Monorepo作用

Monorepo 是一种项目代码管理方式,指单个仓库中管理多个项目,有助于简化代码共享、版本控制、构建和部署等方面的复杂性,并提供更好的可重用性和协作性。

三、使用pnpm的workspace构建monorepo

1、pnpm是什么,及安装pnpm

pnpm 是新一代的包管理工具,号称是最先进的包管理器。按照官网说法,可以实现节约磁盘空间并提升安装速度创建非扁平化的 node_modules 文件夹两大目标,具体原理可以参考 pnpm 官网

安装pnpm:

$ npm install -g pnpm
{
  "scripts": {
    "preinstall": "npx only-allow pnpm"
  }
}

preinstall 脚本会在 install 之前执行,现在,只要有人运行 npm install 或 yarn install,就会调用 only-allow 去限制只允许使用 pnpm 安装依赖。

2、创建workspace

1)、 创建package.json文件

$ pnpm init

2)、 创建pnpm-workspace.yaml文件,并添加项目

作用:定义了工作空间根目录,能使您从工作空间中包含 / 排除目录。

packages:
  # all packages in direct subdirs of packages/
  - 'packages/*'
  # all packages in subdirs of components/
  - 'components/**'
  # exclude packages that are inside test directories
  - '!**/test/**'

3、创建模块依赖

$ pnpm install <package_selector_1> -r --filter <package_selector_2>

package_selector_2中将package_selector_1作为依赖安装

额外补充:

  1. 安装公共依赖:
$ pnpm install <package_selector> -w
  1. 安装公共开发依赖
$ pnpm install <package_selector> -wD
  1. 给某个package单独安装指定依赖

pnpm 提供了 --filter 参数,可以用来对特定的package进行某些操作。

因此,如果想给 <package_selector> 安装一个依赖包,比如 <pkg>,可以进行如下操作:

$ pnpm add <pkg> --filter <package_selector>

参考