corepack

corepack是Node.js官方提供的包管理器版本管理工具,它可以理解为“包管理器的管理器”。日常开发中,项目的依赖版本可以通过package-lock.json等文件锁定,但包管理器(目前主要是npm、yarn、pnpm)本身的版本却无法锁定,不同开发者电脑上的包管理器版本不一致,可能导致安装结果不一致或报错。corepack的出现就是为了解决这个问题,corepack能够识别package.json中的packageManager字段,我们无需手动安装yarn和pnpm,corepack会按照项目声明的版本自动下载并运行对应的包管理器。

Github地址:https://github.com/nodejs/corepack

安装corepack

Node.js从14.19.0版本开始内置corepack,直到25.0之前。如果你的Node.js版本在这个范围内,直接启用即可。corepack enable会在Node.js的可执行目录旁创建yarn和pnpm包管理器的shim(垫片),之后直接运行yarn、pnpm命令时它们就会被corepack接管。

corepack enable

不过从Node.js 25.0版本开始,corepack不再随Node.js分发,目的是让包管理器能够独立于Node.js演进,因此需要我们自行安装。

npm install -g corepack

注意:如果你打算使用corepack接管yarn、pnpm包管理器,且之前用安装脚本或npm全局安装过yarn或pnpm,建议先卸载它们,避免和corepack的shim冲突。

为项目指定包管理器

在项目中执行corepack use命令,可以指定项目使用的包管理器及版本,该命令会把结果写入package.json的packageManager字段,并自动执行一次安装。

corepack use yarn@4.5.0

执行后,package.json中会多出一个packageManager字段,下面是一个例子。字段格式为包管理器名@版本号+哈希值,其中版本号是必须的,哈希值是可选的但建议保留,它可以校验下载的包管理器是否被篡改以确保安全性。

{
  "packageManager": "yarn@4.5.0+sha512.837719ed1df20f1545bf13028bec0a26d8a3f814367d79b78de77dbaff40f2b0fefe4a7bb5e50a9b69c1d1efc2b8a1a0e1fa0e0db1c2424a8e4f088ee63c6c"
}

在项目中使用包管理器

项目配置好packageManager字段后,开发者就不需要关心本地是否安装yarn或pnpm了,直接像往常一样使用即可。

yarn install

corepack会拦截这些命令调用,具体分以下几种情况处理:

如果当前项目声明了对应包管理器:corepack会下载并缓存声明的版本,已缓存则直接使用,然后用它执行命令。

如果当前项目声明的是另一个包管理器:例如在声明了pnpm的项目中执行yarn install,corepack会报错提示你使用正确的包管理器,避免混用包管理器破坏依赖。

如果项目没有声明包管理器:corepack会使用内置的“已知良好版本(Known Good Releases)”。corepack内部维护着一份经过验证、相对稳定的包管理器版本清单,被称为Known Good Releases,你可以理解为它是corepack如何选择包管理器版本的默认值。

升级包管理器

corepack up会把项目使用的包管理器升级到当前大版本内的最新版本,并更新packageManager字段。

corepack up

如果需要跨大版本升级,使用corepack use显式指定。

corepack use yarn@latest

常用辅助命令

查看corepack版本。

corepack --version

更新corepack全局的“已知良好版本”。

corepack install -g yarn@stable

清空corepack下载的包管理器缓存,Windows下默认缓存目录为%LOCALAPPDATA%\node\corepack,其它操作系统下为~/.cache/node/corepack。

corepack cache clean

禁用corepack,移除corepack enable创建的shim。

corepack disable

常用环境变量

corepack通过环境变量控制行为,常用的环境变量有以下几个。

  • COREPACK_NPM_REGISTRY:设置下载包管理器时使用的npm镜像源
  • COREPACK_ENABLE_NETWORK:设置为0时禁止corepack访问网络,适用于离线环境
  • COREPACK_ENABLE_STRICT:设置为0时,corepack不再因为包管理器和项目声明不一致而报错
  • COREPACK_ENABLE_AUTO_PIN:设置为1时,如果项目没有packageManager字段,corepack会自动把当前使用的版本写入该字段
  • COREPACK_HOME:设置corepack的缓存目录
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。