corepack

266 阅读3分钟

包管理器的管理器corepack

新增于: v16.9.0, v14.19.0

基本介绍

Corepack 是一个实验性工具,可帮助管理包管理器的版本。它为每个 支持的包管理器 公开二进制代理,当被调用时,它将识别为当前项目配置的任何包管理器,如果需要透明地安装它,最后运行它而不需要明确的用户交互

安装启用

在以下npm 版本之后已经默认安装:v16.9.0, v14.19.0

较低版本可以通过npm i -g corepack 来安装。

由于该特性目前处于实验阶段,所以需要手动启用

# 启用
corepack enable
# 关闭
corepack disable

npm的支持默认没有启用,可以使用以下命令启用或关闭

# 启用
corepack enable npm
# 关闭
corepack disable npm

项目配置

Corepack 代理将在当前目录层次结构中找到最近的 package.json 文件以提取其 "packageManager" 属性

pakage.json文件中配置packageManager属性,值为<包管理器名称>@<版本>+<哈希>

// ...
"packageManager": "yarn@3.2.3+sha224.953c8233f7a92884eee2de69a1b92d1f2ec1655e66d08071ba9a02fa"
// ...

包管理器名称和版本是必须得,哈希值是可选项。

需要注意这里的版本必须是精确并且是存在的版本,不支持SemVer。

基本使用

如果该值对应于 支持的包管理器,Corepack 将确保对相关二进制文件的所有调用都针对请求的版本运行,如果需要则按需下载,如果无法成功检索则中止。

你可以使用 corepack use 要求 Corepack 更新你的本地 package.json 以使用你选择的包管理器:

corepack use pnpm@7.x # sets the latest 7.x version in the package.json
corepack use yarn@* # sets the latest version in the package.json 

包管理器按照正常方式使用即可,corepack会自动选择对应版本来使用。

全局(项目外)

在项目外使用时,会使用默认的包管理器版本。

corepack默认集成了pnpm和yarn,所以无需单独安装。

如果想切换版本,可以在项目外通过corepack prepare命令来安装,如

corepack prepare pnpm@latest --activate

prepare命令会去下载对应版本的包管理器并存入缓存,--activate命令表示激活使用该版本。

其他更详细的API使用可以查看其Github主页

当在现有项目之外运行时(例如运行 yarn init 时),Corepack 将默认使用与每个工具的最新稳定版本大致对应的预定义版本。可以通过运行 corepack install 命令以及你希望设置的包管理器版本来覆盖这些版本:

corepack install --global yarn@x.y.z 

或者,可以使用标签或范围:

corepack install --global pnpm@*
corepack install --global yarn@stable 

常见问题

Corepack 如何与 npm 交互?#

虽然 Corepack 可以像任何其他包管理器一样支持 npm,但默认情况下不启用它的 shim。这有几个后果:

  • 总是可以在配置为与另一个包管理器一起使用的项目中运行 npm 命令,因为 Corepack 无法拦截它。
  • 虽然 npm 是 "packageManager" 属性中的有效选项,但缺少 shim 将导致使用全局 npm。

运行 npm install -g yarn 不起作用#

npm 防止在进行全局安装时意外覆盖 Corepack 二进制文件。为避免此问题,请考虑以下选项之一:

  • 不要运行这个命令;Corepack 无论如何都会提供包管理器二进制文件,并确保请求的版本始终可用,因此不需要显式安装包管理器。
  • 给 npm install 加上 --force 标志;这将告诉 npm 可以覆盖二进制文件,但你将在此过程中删除 Corepack 文件。(运行 corepack enable 将它们添加回来。)

参考:corepack