Corepack
新增于:v16.9.0, v14.19.0
Corepack 是一个实验性的工具,用于帮助管理你的包管理器的版本。它为每个受支持的包管理器 提供二进制代理,当调用这些代理时,它会识别当前项目配置的包管理器,如果需要则下载它,最后运行它。
尽管 Corepack 与 Node.js 的默认安装一起分发,但 Corepack 管理的包管理器并非 Node.js 发行版的一部分,并且:
- 首次使用时,Corepack 会从网络下载最新版本。
- 任何必需的更新(与安全漏洞或其他问题相关)都不在 Node.js 项目的范围内。如有必要,最终用户必须自己弄清楚如何更新。
此功能简化了两个核心工作流程:
- 它简化了新贡献者的加入,因为他们不再需要遵循特定于系统的安装流程才能获得你想要的包管理器。
- 它允许你确保团队中的每个人都使用你打算让他们使用的确切的包管理器版本,而无需每次需要更新时都手动同步它。
工作流程
启用功能
由于 Corepack 处于实验阶段,目前需要显式启用才能生效。为此,运行 corepack enable
,这将在你的环境中 node
二进制文件旁边设置符号链接(如有必要,将覆盖现有符号链接)。
从现在开始,对受支持的二进制文件 的任何调用都无需进一步设置即可运行。如果你遇到问题,请运行 corepack disable
从你的系统中移除代理(并考虑在Corepack 仓库 上提交问题以告知我们)。
配置包
Corepack 代理将在你的当前目录层次结构中找到最近的 package.json
文件,以提取其 "packageManager"
属性。
如果该值对应于受支持的包管理器,Corepack 将确保对相关二进制文件的所有调用都针对请求的版本运行,并在需要时按需下载,如果无法成功检索则中止。
你可以使用 corepack use
来要求 Corepack 更新你的本地 package.json
以使用你选择的包管理器:
corepack use # 在 package.json 中设置最新的 7.x 版本
corepack use yarn@* # 在 package.json 中设置最新版本
升级全局版本
在现有项目外部运行(例如运行 yarn init
时),Corepack 默认使用预定义版本,这些版本大致对应于每个工具的最新稳定版本。可以通过运行 corepack install
命令以及您希望设置的包管理器版本来覆盖这些版本:
corepack install --global
或者,可以使用标签或范围:
corepack install --global pnpm@*
corepack install --global yarn@stable
离线工作流
许多生产环境没有网络访问权限。由于 Corepack 通常直接从其注册表下载包管理器版本,因此它可能与这些环境冲突。为避免这种情况,请在您仍然拥有网络访问权限时(通常在您准备部署镜像的同时)调用 corepack pack
命令。这将确保即使没有网络访问权限,所需的包管理器也可用。
pack
命令具有 各种标志。有关更多信息,请参阅详细的 Corepack 文档。
支持的包管理器
Corepack 提供以下二进制文件:
包管理器 | 二进制名称 |
---|---|
Yarn | yarn , yarnpkg |
pnpm | pnpm , pnpx |
常问问题
Corepack 如何与 npm 交互?
虽然 Corepack 可以像支持其他包管理器一样支持 npm,但默认情况下其 shims 未启用。这有一些后果:
- 在配置为使用其他包管理器的项目中,始终可以运行
npm
命令,因为 Corepack 无法拦截它。 - 虽然
npm
是"packageManager"
属性中的有效选项,但缺少 shim 将导致使用全局 npm。
运行 npm install -g yarn
不起作用
npm 阻止在进行全局安装时意外覆盖 Corepack 二进制文件。为避免此问题,请考虑以下选项之一:
- 不要运行此命令;Corepack 将无论如何提供包管理器二进制文件,并确保始终可用所需版本,因此无需显式安装包管理器。
- 向
npm install
添加--force
标志;这将告诉 npm 覆盖二进制文件是可以的,但是你将在此过程中删除 Corepack 的二进制文件。(运行corepack enable
以将其添加回来。)