Corepack#

稳定性:1 - 实验性

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 [email protected] # sets the latest 7.x version in the package.json
corepack use yarn@* # sets the latest version in the package.json 

升级全局版本#

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

corepack install --global [email protected] 

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

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

离线工作流程#

许多生产环境没有网络访问权限。由于 Corepack 通常直接从其注册表下载包管理器版本,因此它可能会与这些环境发生冲突。为了避免这种情况,请在您仍然有网络访问权限时调用corepack pack 命令(通常在您准备部署镜像时)。这将确保即使没有网络访问权限,所需的包管理器也能使用。

pack 命令有各种标志。有关更多信息,请参阅详细的Corepack 文档

受支持的包管理器#

以下二进制文件通过 Corepack 提供。

包管理器二进制名称
Yarnyarn, yarnpkg
pnpmpnpm, 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 将它们添加回来。)