LanYunのBlog

LanYunのBlog

马上订阅 LanYunのBlog RSS 更新: https://lanyundev.com/atom.xml

Yarn从Classic迁移到Modern

2025年4月24日 03:55

前言

好久没写文章了,主要是懒,平时睡睡觉,吃吃饭就很舒服了,很早之前也换到过yarn Modern版,但遇到项目不兼容(nodeLinker: “pnp”),然后也没有了 yarn global ,就很不爽,只好老老实实一直用yarn经典版,在逛开源项目的时候,看到有些项目已经支持yarn modern的pnp nodeLinker了,然后忽然突发奇想,想到了一个曲线兼容办法,故写这篇文章用作记录📝。

本文的系统环境和相关信息(仅供参考):

OS: macOS 15.4.1 24E263 arm64,Kernel: 24.4.0,CPU: Apple M1 Max

Homebrew 4.4.32,通过brew安装的 yarn 1.22.22,node 23.11.0,zsh 5.9

迁移

有兴趣可参考官方文档:https://yarnpkg.com/migration/overview

我这里采用全局安装最新稳定版的方式,即和原来brew安装的yarn二进制文件位置不变 /opt/homebrew/bin/yarn,避免影响我某些脚本中写死了的yarn二进制路径(懒得改,我希望更新yarn版本但不希望对我其他代码或工具造成影响。)

1
2
3
brew remove yarn # 移除yarn
corepack enable # 显式开启 Corepack 实验特性,激活 Corepack 功能
corepack install --global yarn@latest # 全局安装最新稳定版

这就代表安装完成了,下面演示在旧项目中的示例。

示例

1
2
3
cd xxx # 进入到你的某个旧项目路径下
yarn set version stable # 可选,有些项目package.json没有packageManager字段,影响不大。
yarn install # 安装依赖

当你在旧项目(有node_modules文件夹)中第一次使用新版yarn时,会保留原node_modules了,也会创建.yarnrc.yml文件,内容: nodeLinker: node-modules,意思是使用旧的链接方式,不会对原项目造成影响,如果你想尝试新版特性,将值改成pnp,再重新yarn install 即可(但项目大概率会崩,因为并不是所有老和新项目都兼容新版特性的,这一般情况下需要说明。),如果崩了,改回去方法同理。

兼容

如果你未曾使用过yarn global且以后也不需要用,则无需阅读本节内容

为了避免影响我系统中的一些工具或脚本对旧版yarn global路径的依赖,同时也为了方便使用并更新yarn全局软件,故采用曲线兼容的方式来实现(可惜不够优雅,但能吃到新版yarn特性还是挺不错的)。

注意:官方并不推荐使用全局安装,但我不想听它的建议,不想让它教我怎么管理软件包,至于说污染全局环境?可笑,你说污染就污染?我对PATH环境中的二进制路径把握是绝对的,每个路径我都清楚,至于说隐式依赖会造成问题?笑死,没人🙌比我👐更懂👌项目代码☝️,没有这个必要,真正懂项目代码的人会清晰的知道有哪些依赖,至于新版yarn完全把global删了的行为,我的评价是:纯纯傻逼,完全不提供可用选项。

新建脚本

1
2
3
open ~/.config/yarn/global # 打开这个文件夹,然后新建yarn-global.sh文件并打开
# 或者用如下命令
vim ~/.config/yarn/global/yarn-global.sh # 编辑此文件

向文件中粘贴下面这段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash

# 获取当前脚本的实际路径
SCRIPT_PATH="$(readlink -f "$0")"
SCRIPT_DIR="$(dirname "$SCRIPT_PATH")"

# 切换到脚本所在的目录
cd "${SCRIPT_DIR}"

# 参数存入数组
args=("$@")

if [[ "${args[0]}" == 'dir' ]]; then
echo "${SCRIPT_DIR}" && exit;
elif [[ "${args[0]}" == 'upgrade' ]]; then
args[0]='up'
elif [[ "${args[1]}" == '--latest' ]]; then
args[1]=''...

剩余内容已隐藏

查看完整文章以阅读更多