惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
人人都是产品经理
人人都是产品经理
博客园 - 聂微东
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
博客园 - Franky
V
V2EX
Y
Y Combinator Blog
Google DeepMind News
Google DeepMind News
J
Java Code Geeks
T
The Blog of Author Tim Ferriss
罗磊的独立博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Jina AI
Jina AI
博客园 - 叶小钗
F
Fortinet All Blogs
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
A
About on SuperTechFans
M
MIT News - Artificial intelligence
云风的 BLOG
云风的 BLOG
Last Week in AI
Last Week in AI
D
Docker
博客园 - 【当耐特】
阮一峰的网络日志
阮一峰的网络日志

LanYunのBlog

优化macOS Dock栏的显示与隐藏 解决macOS全屏模式下某些情况显示原始鼠标指针的问题 nginx自编译 用santa对二进制进行监控和授权 ESXI 8.0安装黑群晖DSM 7.x openwrt编译过程记录 编译monero For macOS ARM 自建busuanzi不蒜子平台统计平台 浅记博客更新日志 (机翻)Kubo配置文件 修改brew services中服务的启动参数 技术杂记📝 解决Surge模块不能同步问题 为Arch Linux配置邮件服务 自编译NutClient-ESXI,更改邮件逻辑 解决ESXI和群晖使用SSH密钥登录问题 为J4125软路由ESXI中群晖提供UPS服务 在arch linux上搭建rustdesk server 解决虚拟机扩容中GPT PMBR大小不符问题 搭建Tuic V5 优雅地为macOS提供python多版本的支持 修复root路径下文件权限问题 解决macOS 14上利用Whisky运行steam时有关问题 在macOS中用PhpStorm配置Xdebug调试 利用CloudFlare Workers快速自建一个IP获取器 如何自动续期证书? 从0开始速配VPS用于网站等 搭建一个基于ChatGPT的QQ机器人(Yunzai-Bot) For Mac 010 Editor For Mac 13.0.1 Crack 破解 关于部署Cloudflare Zero Trust遇到的问题浅记录📝
Yarn从Classic迁移到Modern
LanYun · 2025-04-23 · via LanYunのBlog

前言

好久没写文章了,主要是懒,平时睡睡觉,吃吃饭就很舒服了,很早之前也换到过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 
corepack enable
corepack install --global yarn@latest

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

示例

1
2
3
cd xxx 
yarn set version stable
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 

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]=''
fi

yarn "${args[0]}" ${args[1]}

保存后用命令给文件权限

1
2
chmod 777 ~/.config/yarn/global/yarn-global.sh 
echo -n ~/.config/yarn/global/yarn-global.sh | pbcopy

新增命令

如果你的终端shell不是用的zsh,也可作参考(同理的)。

编辑~/.zshrc文件(不限定什么方式)

1
vim ~/.zshrc 

然后新增一行内容

1
alias yarn-global='xx' 

保存,这样新开的终端就应用你的配置了,如果想让旧终端也应用,命令:source ~/.zshrc

如果你希望以后安装的全局包也能被识别,请参考下面代码

1
2
echo -n :~/.config/yarn/global/node_modules/.bin | pbcopy 
vim ~/.zshrc

如果文件已有 export PATH= 之类的内容,那么在靠近最后一个引号的左边粘贴你的剪贴板内容即可

如果没有

1
export PATH="$PATHxx" 

保存即可。

修改历史命令记录

如果想用的更丝滑,可以修改历史命令记录。

1
LC_ALL=C sed -i '' 's/yarn global /yarn-global /g' ~/.zsh_history 

参考代码

交互式更新:yarn-global upgrade-interactive --latest (其实--latest是没必要的)

非交互式更新:yarn-global upgrade

安装包:yarn-global add xx

移除包:yarn-global remove xx