使用 yarn global 代替 npm -g

在项目中使用 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 作用类似,但它们仍然是不同的两个模块系统,尽可能避免混用,以避免产生冲突。


边城客栈
全栈技术专栏,公众号「边城客栈」,[链接]

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

58k 声望
28.4k 粉丝
0 条评论
推荐阅读
羡慕 C# 的 switch 表达式不,JS 也可以有
对于 C/Java 语系的语言,都有 switch 语法。switch 语法用于多分支是一个标准的用法,但这个分支语法的各分支之间存在穿透性,所以需要 break 来切断逻辑,这也成为 switch 语法中最重要的一个替在缺陷来源。此...

边城2阅读 1.3k

封面图
【深入浅出 Yarn 架构与实现】6-1 NodeManager 功能概述
本节开始将对 Yarn 中的 NodeManager 服务进行剖析。NodeManager 需要在每个计算节点上运行,与 ResourceManager 和 ApplicationMaster 进行交互。管理节点的计算资源以及调度容器。后续将对 NM 的功能职责、状态...

大数据王小皮阅读 413

【深入浅出 Yarn 架构与实现】5-3 Yarn 调度器资源抢占模型
本篇将对 Yarn 调度器中的资源抢占方式进行探究。分析当集群资源不足时,占用量资源少的队列,是如何从其他队列中抢夺资源的。我们将深入源码,一步步分析抢夺资源的具体逻辑。

大数据王小皮阅读 413

【深入浅出 Yarn 架构与实现】5-2 Yarn 三种调度器
本篇文章将深入介绍 Yarn 三种调度器。Yarn 本身作为资源管理和调度服务,其中的资源调度模块更是重中之重。下面将介绍 Yarn 中实现的调度器功能,以及内部执行逻辑。

大数据王小皮阅读 388

【深入浅出 Yarn 架构与实现】5-1 Yarn 资源调度器基本框架
资源调度器是 YARN 中最核心的组件之一,它是 ResourceManager 中的一个插拔式服务组件,负责整个集群资源的管理和分配。Yarn 默认提供了三种可用资源调度器,分别是FIFO (First In First Out )、 Yahoo! 的 Capa...

大数据王小皮阅读 388

【深入浅出 Yarn 架构与实现】6-2 NodeManager 状态机管理
NodeManager(NM)中的状态机分为三类:Application、Container 和 LocalizedResource,它们均直接或者间接参与维护一个应用程序的生命周期。

大数据王小皮阅读 361

Cesium加载广告牌(三)
在加载广告牌的过程中,已经对广告牌进行了许多属性的设置,但是并没有对广告牌的唯一值进行规范。设置唯一值并不是在billboard的属性内设置,而是在外层的Entity内进行声明。同时Entity中也有name属性。这里需要...

中亿丰数字科技阅读 283

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

58k 声望
28.4k 粉丝
宣传栏