使用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:, 不用其他方式安装, corepack 的加载对应包的逻辑是一样的brew install 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 管理的。 先install
后use
也是为了离线使用方便corepack use pnpm@latest
项目维度,使用指定的包管理工具corepack install
:安装项目依赖的包管理工具
配合 volta
这种方案, 相当于 node 交给了 volta 管理, 同时全局的 npm 也是交给了 volta, 我们在 volta 中删除 yarn ,pnpm 本身, 把这两个交给 corepack 管理。
我没有把安装 corepack
交给 volta, 而是使用了 homebrew
, 如果使用 volta 安装 corepack
, corepack
安装的 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 一定是包管理工具的标准,所以用起来把。