前言
好久没写文章了,主要是懒,平时睡睡觉,吃吃饭就很舒服了,很早之前也换到过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 | brew remove yarn |
这就代表安装完成了,下面演示在旧项目中的示例。
示例
1 | cd xxx |
当你在旧项目(有node_modules文件夹)中第一次使用新版yarn时,会保留原node_modules了,也会创建.yarnrc.yml文件,内容: nodeLinker: node-modules,意思是使用旧的链接方式,不会对原项目造成影响,如果你想尝试新版特性,将值改成pnp,再重新yarn install 即可(但项目大概率会崩,因为并不是所有老和新项目都兼容新版特性的,这一般情况下需要说明。),如果崩了,改回去方法同理。
兼容
如果你未曾使用过yarn global且以后也不需要用,则无需阅读本节内容
为了避免影响我系统中的一些工具或脚本对旧版yarn global路径的依赖,同时也为了方便使用并更新yarn全局软件,故采用曲线兼容的方式来实现(可惜不够优雅,但能吃到新版yarn特性还是挺不错的)。
注意:官方并不推荐使用全局安装,但我不想听它的建议,不想让它教我怎么管理软件包,至于说污染全局环境?可笑,你说污染就污染?我对PATH环境中的二进制路径把握是绝对的,每个路径我都清楚,至于说隐式依赖会造成问题?笑死,没人🙌比我👐更懂👌项目代码☝️,没有这个必要,真正懂项目代码的人会清晰的知道有哪些依赖,至于新版yarn完全把global删了的行为,我的评价是:纯纯傻逼,完全不提供可用选项。
新建脚本
1 | open ~/.config/yarn/global |
向文件中粘贴下面这段代码
1 | #!/bin/bash |
保存后用命令给文件权限
1 | chmod 777 ~/.config/yarn/global/yarn-global.sh |
新增命令
如果你的终端shell不是用的zsh,也可作参考(同理的)。
编辑~/.zshrc文件(不限定什么方式)
1 | vim ~/.zshrc |
然后新增一行内容
1 | alias yarn-global='xx' |
保存,这样新开的终端就应用你的配置了,如果想让旧终端也应用,命令:source ~/.zshrc
如果你希望以后安装的全局包也能被识别,请参考下面代码
1 | echo -n :~/.config/yarn/global/node_modules/.bin | pbcopy |
如果文件已有 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









