15

在项目中使用 yarn 代替 npm 没什么坑,但是使用 yarn 全局安装模块的时候有些东西需要注意一下:

yarn global

首先,yarn 的全局安装并不是加 -g 或者 --global 这样的参数,它使用 yarn global 命令。用 yarn global --help 可以看到子命令列表

Usage: yarn global [add|bin|ls|remove|upgrade] [flags]

这些子命令的用法和非 global 的同名命令用法差不多。

全局 node_modules 的位置

yarn 的全局 node_modules 位置和 npm 的不同,但是我没有什么好的方法去寻找它。不过我注意到系统的 PATH 中有 C:/Users/james/AppData/Local/Yarn/.bin,这大概是在安装 yarn 的时候安装程序配置进去的。因此,我猜测 C:/Users/james/AppData/Local/Yarn 会存在全局的相关东西。

注意1:路径中的 james 是我的 Windows 用户名,这需要改成你自己当前登录的用户的用户目录。
注意2:为了避免 Markdown 的转义问题,路径中的使用了斜线(除号)分隔目录,实际应该是反斜线

先使用 yarn global add 随便安装两个模块,然后进入 C:/Users/james/AppData/Local/Yarn 去搜索,把 yarn 的全局 node_modules 目录定位到了 C:/Users/james/AppData/Local/Yarn/config/global。顺便也找到了 yarn 的缓存目录 C:/Users/james/AppData/Local/Yarn/cache

但其实我们并不需要关心全局模块放在哪里,因为如果需要删除模块,用 yarn global remove 就好,如果需要清除缓存,用 yarn cache clean 就好。

指定 bin 目录

对于一些带 CLI 的模块,通过 yarn global add 可能会出问题,大概是因为默认的全局 bin 目录是 C:/Program Files/nodejs(用 yarn global bin 命令就可以查出来)。然而可能是因为权限问题,模块对应的 .cmd 文件并不能创建到 C:/Program Files/nodejs 中去。

这个时候可以通过 --prefix 参数来指定 bin 目录。既然 PATH 中都配置了 C:/Users/james/AppData/Local/Yarn/.bin,就直接指定到这个目录好了。以安装 typescript 为例

yarn global add typescript --prefix C:/Users/james/AppData/Local/Yarn/.bin

其实每次都要写这么长一个路径挺烦人的,所以不妨把它设置成一个 Windows 环境变量(或用户环境变量),比如叫 YARN_BIN,然后直接在 --prefix 参数中指定 %YARN_BIN% 就好。如果是临时设置环境变量可以在命令行使用 set 命令设置,比如

set YARN_BIN=C:/Users/james/AppData/Local/Yarn/.bin
yarn global add typescript --prefix %YARN_BIN%

注意不要与 npm 产生冲突

npm 的 bin 路径在 C:/Users/james/AppData/Roaming/npm,所以我曾经想把 yarn 的 bin 路径指向这里,然而结果是让我删掉了整个这个目录,重新装了一遍 node.js(为了重装 npm)。

yarn 会把 C:/Users/james/AppData/Roaming/npm/node_modules 目录的结构改掉,并把之前用 npm 安装的一些模块删除掉,包括 npm 本身依赖的模块,最终导致 npm 不可用。

总的来说,虽然 npm 和 yarn 作用类似,但它们仍然是不同的两个模块系统,尽可能避免混用,以避免产生冲突。


边城
59.8k 声望29.6k 粉丝

一路从后端走来,终于走在了前端!