问题背景
yarn 1.22 版本包括 1.x 的版本,被称为 Classic Yarn。
也就是经典 Yarn。但是这个版本的yarn 从 2020 年 1 月就不再更新了。而最新版本的 yarn 已经更新到 4.0 了,有着更有好的用户界面和修复更多的问题,并且配置项的分类更加清晰,使用 yaml 格式的配置文件来代替以往的 yarnrc 文件。
Corepack 包介绍
Corepack 是 nodejs 团队和 yarn, pnpm 等第三方依赖管理工具团队一起开发的,用于方便 nodejs
切换 yarn, pnpm 等各种依赖管理工具。
Corepack 从 nodejs 的 v16.9.0, v14.19.0 版本引入,并默认集成在之后的 nodejs 版本中。
但是目前为止依旧是实验性功能。
这里我默认安装 nodejs v18.20.0 版本,直接查看 corepack 显示是 0.25.2
而这个版本的 corepack 存在 bug, 访问不到终端代理,所以我们卸载这个版本,直接安装一个更高等级的
版本。我从公告中得知最低要 0.27 才修复了代理的bug。
执行以下命令进行升级:
npm uninstall -g yarn pnpm
npm uninstall -g corepack
npm install -g corepack@v0.29.4
官方在 corepack 中默认集成了 yarn 和 pnpm, 所以卸载 corepack 时最好连这两个一起卸载了。
记得安装完 corepack 后再执行 corepack enable
使用 Corepack 安装 Yarn 4.1.1
直接执行 corepack enable
, 会启用 corepack 的功能,并且将 nodejs 中关于 yarn 和 pnpm
的启动脚本添加到系统路径。注意这里的启动脚本本质是一个指向了 nodejs 的 corepack 包中名为
yarn 和 pnpm 的同名 js 脚本,这两个脚本负责检测 yarn 和 pnpm 是否已经安装在全局,没有时
会询问是否在线安装。
而默认安装的 yarn 是 1.22.22 版本,pnpm 是 9.13.2 版本
所以如果需要安装 4.0 的 yarn,我们直接手动安装就行
corepack install --global yarn@4.1.1
注意这个是直接连接官网镜像下载,需要配置终端代理来访问才好下载。
当执行完后,直接全局运行 yarn
,就会显示版本是 4.1.1, 不会再询问是否下载了。
配置项目使用 Yarn 4.1.1
从 Yarn 1.X 版本迁移
根据 Yarn 官方的指导,从一个使用 Yarn 1.x 版本的项目迁移到使用 Yarn 4.0 可以按照以下步骤进行:
- 确保 nodejs 用的是 18 版本以上
- 执行
corepack enable
激活 Corepack 功能 - 进入到项目目录中
- 执行命令 yarn set version 4.1.1, 这条命令会在项目的
package.json
中添加以下内容,这是告诉 corepack 在处理 yarn 时,用哪个版本去安装依赖
{
"packageManager": "yarn@4.1.1"
}
- 如果项目中依赖了
.npmrc
或者.yarnrc
, 需要参考 https://yarnpkg.com/configuration/yarnrc 里面的新配置项,将配置转为.yarnrc.yml
的格式 - 执行
yarn install
安装项目依赖即可
注意此时的 yarn 是用 yarn PnP 来管理依赖,而不是传统的 node_modules 那样,yarn PnP 是 yarn 自己创建的管理依赖方式,安装的依赖包不会再出现在 node_modules 目录下面。
所以在执行 yarn install
之前,新建一个 .yarnrc.yml,
里面写上下面的内容,就可以用传统的 node_moudles 方式来管理依赖
nodeLinker: node-modules
如果是新的项目
新的项目可以直接执行下面步骤
- 执行命令 yarn set version 4.1.1
- 创建 .yarnrc.yml, 里面写上
nodeLinker: node-modules
。虽然官方推荐用他们的 Yarn PnP 系统,但是这个并没有在社区推广开来,不建议使用,还是用原始的 npm 系统就好 - 执行
yarn install
就行。
如果需要配置 npm 淘宝镜像,可以在 .yarnrc.yml 里面配置
# 官方镜像
# npmRegistryServer: "https://registry.yarnpkg.com"
# 淘宝镜像
npmRegistryServer: "https://registry.npmmirror.com"
也可以配置成内部的私有 npm 镜像。
参考文档
https://yarnpkg.com/migration/guide
https://nodejs.org/api/corepack.html