nodejs的corepack处理包版本差异问题
经常在项目中,我们会因为项目所需要依赖的包版本不同导致运行时出错等问题,例如我当下正在研发的一个项目采用的是pnpm的6.x版本,但是有位同事的pnpm的版本为7.x版本,这时候由于版本的不同,导致在跑指令的时候,同事的项目无法成功执行。这个时候,我们可以通过corepack为我们解决这个问题。
# 什么是corepack
Node.js 默认提供 npm 包管理器,Corepack 为您提供 Yarn 和 pnpm,而无需安装它们。它是一个Nodejs的核心包,新增于 v16.9.0, v14.19.0 以后的node版本(新增了corepack全局指令)。当被调用时,它将识别为当前项目配置的任何包管理器。
由于corepack仍处于实验状态,目前需要显式地启用 Corepack 才能生效 我们通过命令行输入corepack enable 开启。
corepack enable
当我们开启之后,node会在其根目录的bin下增加 pnpm, pnpx, yarn, yarnpkg 四个指令,这个时候我们就可以全局使用这四个指令进行包依赖的安装管理了。
与此同时,node在package.json内提供了"packageManager" 属性,它定义了在处理当前项目时预期使用的包管理器。 它可以设置为任何支持的包管理器,并确保团队使用完全相同的包管理器版本,而无需安装 Node.js 以外的任何其他东西。
例如我们在packagejson下设置了pnpm 6x
{
"packageManager": "<package manager name>@<version>"
}
{
"packageManager": "pnpm@6.3.4"
}
2
3
4
5
6
这个时候,拥有7x版本的同事运行完corepack enable指令后run该项目时, node就会去为你安装下载好pnpm@6.3.4版本的pnpm,并基于此版本运行代码,从而解决了不同的电脑下造成的环境问题, 同时约束用户在pnpm的项目下只能使用pnpm,而无需再通过书写脚本对命令行进行截断判断来限制用户使用的包管理器(详情可看 如何统一npm包管理一文),这个时候,corepack和nvm非常类似。
Node.js Corepack 默认无法拦截 npm,无论 "packageManager" 的值为 pnpm 还是 yarn 的项目,都可以使用 npm 命令。为了能让 npm 作为全局包管理器在任何项目完美运行,当然如果你想拦截也是可以的,需要通过 corepack enable npm 解决。
# 其他指令
# 启用/关闭
corepack enable
corepack disable
2
# 指定新的全局包管理器
我希望使用 pnpm@7.x 版本替代现在的 pnpm@6.x,我就可以这样。
// prepare 下载 xxx版本
// --activate 将其设为主版本
corepack prepare pnpm@7.x --activate
2
3
# 我的node不是最新版如何使用
npm install -g corepack