正如 IE 的唯一作用是安装 Chrome,npm 的作用也是用来安装 yarn/pnpm

最近 pnpm 8 发布,把公司 monorepo 的 pnpm 版本升级到 8 了,借机测试了一下安装 pnpm 的各种方法,最后发现 Node.js 推出的Corepack 是最好用的。

Corepack 是 Node.js 推出的包管理器的管理器。类似于 nvm 可以一行命令安装、切换 Node.js 的版本,Corepack 可以一行命令安装、切换 npm / yarn / pnpm 的版本。

除此之外,Corepack 还有一个特性,能够读取项目的 packge.json 中的 pacakgeManager 字段,从而自动切换到对应版本的包管理器。这在多人、多项目协作开发中非常有用,比如 pnpm@7.0.0pnpm@8 不兼容彼此的 pnpm-lock.yaml,如果 pnpm 版本不统一,很容易出问题。

使用 corepack 安装 pnpm 的方法:

corepack enable
corepack prepare pnpm@latest --activate # 旧版 Node.js 不支持 pnpm@latest,需要具体到 pnpm@x.y.z

安装完成后,使用 cat 可以确认,pnpm <args> 现在运行的是 corepack pnpm <args>

cat $(which pnpm)


下面演示 Corepack 在不同项目间自动切换包管理器的特性。

我在全局使用 Corepack 安装 pnpm@8.3.1,随后在 playground 目录下创建了一个 playground/npm/package.json,规定使用 pnpm@7.0.0 作为包管理器。

{
  "packageManager": "pnpm@7.0.0"
}

可以看到在 playground 目录下 pnpm 版本为 8.3.1,在 npm 目录下就自动切换到了 7.0.0

pnpm 自动切换版本

多人协作开发,只要配置好 packageManager,然后让别人用 Corepack 安装包管理器,能节省很多时间。