包管理器的管理器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