Skip to content

pnpm + workspace 搭建 monorepo 项目

搭建项目

安装pnpm

bash
npm install -g pnpm

项目初始化

在项目根目录中新建pnpm-workspace.yaml文件,里面写入以下内容,将packages下的所有文件当做子工程:

json
packages:
- 'packages/*'

为了演示,先在项目根目录中创建packages目录,并在packages中创建两个文件夹pkg1和pkg2,这两个文件夹就代表着两个不同的工程。分别在这两个文件夹中使用pnpm init 初始化项目,并在package.json中的name字段命名为@组织名/pkg1(组织为npm上创建的)。

如果使用ts开发的话安装ts使用tsc初始化下tsconfig.json文件。具体内容等以后cli的文章讲解。

我们发包的话只需要将pkg1和pkg2发布出去,为了防止根目录被发布出去,需要在根目录中package.json中配置privatetrue

安装依赖包

在workspace中安装包分为以下几种情况:

全局包

  • 全局的公共依赖包,比如说打包用的rollupunbuildtypescript等等

pnpm中提供了#-w, --workspace-root 参数,不管node目录是在哪个子包中,带上这个参数会将依赖安装到项目的根目录中,作为所有的package的公共依赖使用。 比如:

bash
pnpm install/add unbuild typescript -w

这个命令会将依赖安装到生产依赖中,如果需要安装的是一个开发依赖,可以加上-D这个参数,会把依赖安装到package.json 中的devDependencies中:

bash
pnpm add rollup -wD

给package中某个项目安装

pnpm提供了--filter命令,允许将命令限制到特定的一个子集。比如:给pkg1安装commander:

bash
pnpm add cpmmander --filter @dylan/pkg1

@dylan/pkg1这个参数为子包的package.json中的name属性的值。

子包之间的互相依赖

这种也是我们开发中常用到的场景,比如pkg1中将pkg2作为依赖安装:

pnpm install @dylanjs/pkg2 --filter @dylanjs/pkg1

此时我们查看pkg1package.json中的dependencies中已经有pkg2

设置依赖的时候我们可以使用workspace:*,这样就可以使用最新的版本了,不需要每次都手动的修改版本,当执行npm publish 命令的时候,会自动将pckage.json中的workspace修改为正确的版本。