使用corepack管理包管理工具


前言

nodejs/corepack: Zero-runtime-dependency package acting as bridge between Node projects and their package managers 是 node 官方推出的,用来管理包管理工具的工具。可以使得在项目维度下,固定包管理工具。

它也是自动去下载包管理工具的, 和 volta pin 的效果一样,我们无须再手动安装 yarn, pnpm 了。

安装方式

node 16 之后, 好像就内置了, 但版本不是最新的, 我还是会通过其他方式安装:

  • mac/linux: brew install corepack, 不用其他方式安装, corepack 的加载对应包的逻辑是一样的
  • npm 全局安装 npm install -g corepack

使用

项目维度,固定版本后,会自动添加 packageManager 字段到 package.json 中。

  • corepack enable: install the required Yarn and pnpm binaries on your path. 通过 npm install -g corepack 安装后, 也会出现 yarn, pnpm 两个命令,使用的时候,会自动安装
  • corepack install --global yarn@x.y.z , 全局维度使用的 yarn 版本, Mac 下可通过 ls -la $(which yarn) 查看到是 corepack 管理的。 先 installuse 也是为了离线使用方便
  • corepack use pnpm@latest 项目维度,使用指定的包管理工具
  • corepack install:安装项目依赖的包管理工具

配合 volta

这种方案, 相当于 node 交给了 volta 管理, 同时全局的 npm 也是交给了 volta, 我们在 volta 中删除 yarn ,pnpm 本身, 把这两个交给 corepack 管理。

我没有把安装 corepack 交给 volta, 而是使用了 homebrew, 如果使用 volta 安装 corepackcorepack 安装的 yarn, pnpm 又被 volta 管理了, 会有冲突, 因为 volta 也会管理包管理工具。

配合 fnm

fnm 其实也是管理的 node + npm 的版本, 但是它不会管理 yarn, pnpm, 所以我们可以把 yarn, pnpm 交给 corepack 管理。

这个时候的 corepack, 可以使用 npm install -g corepack 安装, fnm 并不管理包管理工具, 所以不存在 fnm 和 corepack 的冲突。

原理

fnm 切换不同 node 后, corepack 版本即使不一致,对应的包版本也是能保持一致的。

这是因为各个 node 版本下 corepack 找包的逻辑是相同的, 他们的缓存位置都是 ~/.cache/node/corepack 中去找对应的包。

技术总结

从趋势上看, corepack 一定是包管理工具的标准,所以用起来把。