文档章节

yarn

黑魔法
 黑魔法
发布于 2016/12/07 16:29
字数 1670
阅读 21
收藏 1
点赞 0
评论 0



yarn 有什么优点?
https://yarnpkg.com/

yarn 和 npm 做的是完全一样的事情:作为 nodejs 的包管理工具。既然是一样的事情,那么 yarn 必须有一些优点,才能说服大家去用。

 

根据官方网站的介绍,yarn 有以下六项特点:

 

> 离线模式(重要)

如果之前已经安装过一个软件包,再次安装时就不用再从网络下载了。

 

这一点很重要,npm 饱受诟病的一点就是,每次安装依赖,都需要从网络下载一大堆东西,而且是全部重新下载。工程多的时候比较烦人。这下子可以节约大量时间了。

 

> 依赖关系确定性(重要)

在每一台机器上针对同一个工程安装依赖时,生成的依赖关系顺序和版本是一致的。




 

之前 npm 在这里有一个处理得不好的地方。举例来说,我写的工程依赖 A, B, C 三个库,我在编写 package.json 的时候,给 A, B, C 都指定了版本号。但是 A 库可能又依赖 D, E, F 库,D 库又依赖 G, H 库。这么多关联依赖关系中,很可能某个库在指定依赖时,没有指定版本号。

 

于是,这就导致了一个问题。如果我在另一台机器上对同样的工程安装依赖,或者把这台机器工程下的 node_modules 目录删除来重新安装依赖。由于关联依赖中,没有指定版本号的库,发生了版本更新,就会导致再次安装的依赖,其中具体某些软件包的版本是不一致的

 

在这种情况下,你会发现原来能够正常运行的程序,忽然变得不能工作或一堆 BUG. 我在最近使用 react-native 编写手机应用时,就遭遇过这样的问题。只能采取一些很曲折的方式来解决。

 

yarn 采用的解决方式是,引入了一个 yarn.lock 文件来应对这个问题。lock 机制在很多包管理中都有用到。例如 ruby 的 rubygems 就会生成 Gemfile.lock.

 

yarn.lock 会记录你安装的所有大大小小的软件包的具体版本号。只要你不删除 yarn.lock 文件,再次运行 yarn install 时,会根据其中记录的版本号获取所有依赖包。你可以把 yarn.lock 提交到版本库里,这样其他同事签出代码并运行 yarn install 时,可以保证大家安装的依赖都是完全一致的。

 

这就特别适合大型项目的多人协作开发和部署。

 

> 更好的网络性能

下载软件包时,会进行更好的排序,避免“请求瀑布”,最大限度提高网络利用率。

 

> 多注册来源处理

所有的依赖包,不管他被不同的库间接关联引用多少次,安装这个包时,只会从一个注册来源去装,要么是 npm 要么是 bower, 防止出现混乱不一致。

 

> 网络弹性处理

安装依赖的过程中,不会因为某个单次网络请求的失败导致整个安装挂掉(这里又要黑一下 npm)。当请求失败时会进行自动重试。

 

> 扁平模式(重要)

当关联依赖中包括对某个软件包的重复引用,在实际安装时将尽量避免重复的创建。

 

为了说明这个问题,我们假设目前工程依赖 A, B, C 三个库,而他们对某个库 somelib 存在这样的依赖关系:

 

A - somelib 1.4.x
B - somelib 1.6.x
C - somelib 1.6.x

 

如果要安装 ABC 三个库,那么 somelib 会存在版本冲突。npm 会在实际安装时,给三个库分别下载各自依赖的 somelib 版本。假设 npm 先安装了 A, 由于 A 依赖 somelib 1.4.x 版本,那么 1.4.x 会变成主版本。

再安装 B, C 时,由于 B, C 依赖的都不是 1.4.x, 于是安装完之后,关系就变成这个样子了:

 

node_modules
├── A
├── somelib 1.4.x
├── B
│   └── node_modules
│       └── somelib 1.6.x
└── C
    └── node_modules
        └── somelib 1.6.x

 

明明 B, C 都依赖 1.6.x 版本,实际上 npm 却要把这个版本保存两次,这样明显是对磁盘空间的浪费。我们把这种情况就称为“不扁平的”。尽管 npm 也提供了诸如 flat 等指令去支持“扁平化”处理,yarn 明显试图在这方面做得更好。

 

总之来说,yarn 要做到的就是三点:快速,安全,可靠



实际的使用体会
 

我把自己手头的几个用到 npm 安装 js 依赖的 rails 工程还有静态 web 工程下的 node_modules 子目录删除,然后用 yarn install 重新安装依赖。

 

实际体验是速度要比 npm 快上不少,基本上可以令人满意。原来 npm install 需要 8 - 10 分钟的一个工程,改用 yarn install 后,只需 72 秒完成。

 

而且更令人欣喜的是:如果某个 js 库的某个版本在这个系统里被安装过一次,那么另一个工程再次需要安装这个库时,就完全不用再次下载。会直接从当前系统里获取这个库。大大节约了网络传输量和下载安装时间。

 

可以做一个简单的测试,对某个工程执行过 yarn install 后,删除 node_modules 目录,再次 yarn install. 会看到完全不用进行网络下载,几秒内就能再次生成 node_modules 目录。

 

这其中 lock 机制起到了很大的作用。对于经常要同时编写维护很多依赖 nodejs 的工程师而言,这是一个非常好的消息。

 

建议大家马上开始尝试使用 yarn.

 

--------------------

 

2016.10.13 补充:

 

如果觉得安装速度慢,安装源和原来 npm 是一样的,可以通用,修改方法如下:

yarn config get registry
# -> https://registry.yarnpkg.com

可以改成 taobao 的源:

yarn config set registry 'https://registry.npm.taobao.org'
# -> yarn config v0.15.0
# -> success Set "registry" to "https://registry.npm.taobao.org".
# -> Done in 0.04s.

然后 yarn install 的速度就快多了

 

另外,目前的小瑕疵还是不少,例如我刚刚遇到的问题,某个工程的 package.json 里面是这样写的:

"eslint-plugin-markdown": "*",

yarn install 的时候报错:

error Couldn't find any versions for eslint-plugin-markdown that matches *.

改成

"eslint-plugin-markdown": "latest",

之后,安装可以通过。


此外,这样的写法(直接引用本工程路径)目前也是不支持的:

"eslint-plugin-material-ui": "./packages/eslint-plugin-material-ui",

 

类似的小问题估计在近期会被各种人发现(提 issue 呗),最后如何取舍,是否都能修复,看团队的反应。目前还是可以看好。

本文转载自:https://www.zhihu.com/question/51502849?sort=created

共有 人打赏支持
黑魔法
粉丝 10
博文 154
码字总数 43466
作品 0
武汉
前端工程师
HDFS 实验 (四) 集群操作

集群设置 http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/ClusterSetup.html 用户手册 http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdf......

pcdog ⋅ 04/13 ⋅ 0

Ranger-Yarn插件安装

Ranger-Yarn插件ranger-0.6.0-yarn-plugin安装到Yarn的所有ResourceManager节点, 其他的NodeManager节点不需要安装。 登陆hdfs安装的用户,garrison/zdh1234(用户组hadoop),获取安装包解压安...

木木与呆呆 ⋅ 04/26 ⋅ 0

Apache Hadoop 3.1.0 发布,原生支持 GPU 和 FPGA

Apache Hadoop 3.1.0 正式发布了,Apache Hadoop 3.1.0 是2018年 Hadoop-3.x 系列的第一个小版本,并且带来了许多增强功能。不过需要注意的是,这个版本并不推荐在生产环境下使用,如果需要在...

李玉珏 ⋅ 04/13 ⋅ 0

Spark的运行架构分析(二)之运行模式详解

在上一篇博客 spark的运行架构分析(一)中我们有谈到Spark的运行模式是多种多样的,那么在这篇博客中我们来具体谈谈Spark的运行模式 本博客转载自https://blog.csdn.net/gamer_gyt/article...

lubin2016 ⋅ 04/18 ⋅ 0

Hadoop、MapReduce、YARN和Spark的区别与联系

(1) Hadoop 1.0 第一代Hadoop,由分布式存储系统HDFS和分布式计算框架MapReduce组成,其中,HDFS由一个NameNode和多个DataNode组成,MapReduce由一个JobTracker和多个TaskTracker组成,对应...

cuiyaonan2000 ⋅ 05/08 ⋅ 0

Hadoop 2.5.0编译到Apache Hadoop Common失败

[INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] Apache Hadoop Main ................................. SUCCES......

尧雪 ⋅ 04/19 ⋅ 0

spark-使用总结-大数据基础入门

1、partition数目 spark的输入可能以多个文件的形式存储在HDFS上,每个File都包含了很多块,称为Block。 当Spark读取这些文件作为输入时,会根据具体数据格式对应的InputFormat进行解析,一般...

我叫大兄弟 ⋅ 05/08 ⋅ 0

使用IDEA 搭建 spark on yarn 的开发环境+调试~

1.导入yarn和hdfs配置文件 因为spark on yarn 是依赖于yarn和hdfs的,所以获取yarn和hdfs配置文件是首要条件,将core-site.xml、hdfs-site.xml 、yarn-site.xml 这三个文本考入到你IDEA项目里...

qq_31806205 ⋅ 05/25 ⋅ 0

Yarn 1.8.0 发布,Facebook 推出的 JS 包管理器

Facebook 推出的 JavaScript 包管理器 Yarn 发布了 1.8.0 版本,Yarn 是 Facebook 推出的 JavaScript 包管理器,旨在提供 npm 之外的另一种选择方案。Yarn 具有极佳的伸缩性,可以支持成千上...

达尔文 ⋅ 06/12 ⋅ 0

一文看懂npm、yarn、pnpm之间的区别

本文作者对比了当前主流的包管理工具npm、yarn、pnpm之间的区别,并提出了合适的使用建议,以下为译文: NPM npm是Node.js能够如此成功的主要原因之一。npm团队做了很多的工作,以确保npm保持...

codeGoogle ⋅ 06/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

6. Shell 函数 和 定向输出

Shell 常用函数 简洁:目前没怎么在Shell 脚本中使用过函数,哈哈,不过,以后可能会用。就像java8的函数式编程,以后获取会用吧,行吧,那咱们简单的看一下具体的使用 Shell函数格式 linux ...

AHUSKY ⋅ 8分钟前 ⋅ 0

MySQL 内核深度优化

MYSQL数据库适用场景广泛,相较于Oracle、DB2性价比更高,Web网站、日志系统、数据仓库等场景都有MYSQL用武之地,但是也存在对于事务性支持不太好(MySQL 5.5版本开始默认引擎才是InnoDB事务...

OSC_cnhwTY ⋅ 15分钟前 ⋅ 0

单片机软件定时器

之前写了一个软件定时器,发现不够优化,和友好,现在重写了 soft_timer.h #ifndef _SOFT_TIMER_H_#define _SOFT_TIMER_H_#include "sys.h"typedef void (*timer_callback_function)(vo...

猎人嘻嘻哈哈的 ⋅ 17分钟前 ⋅ 0

好的资料搜说引擎

鸠摩搜书 简介:鸠摩搜书是一个电子书搜索引擎。它汇集了多个网盘和电子书平台的资源,真所谓大而全。而且它还支持筛选txt,pdf,mobi,epub、azw3格式文件。还显示来自不同网站的资源。对了,...

乔三爷 ⋅ 26分钟前 ⋅ 0

Debian下安装PostgreSQL的表分区插件pg_pathman

先安装基础的编译环境 apt-get install build-essential libssl1.0-dev libkrb5-dev 将pg的bin目录加入环境变量,主要是要使用 pg_config export PATH=$PATH:/usr/lib/postgresql/10/bin 进......

玛雅牛 ⋅ 27分钟前 ⋅ 0

inno安装

#define MyAppName "HoldChipEngin" #define MyAppVersion "1.0" #define MyAppPublisher "Hold Chip, Inc." #define MyAppURL "http://www.holdchip.com/" #define MyAppExeName "HoldChipE......

backtrackx ⋅ 56分钟前 ⋅ 0

Linux(CentOS)下配置php运行环境及nginx解析php

【part1:搭建php环境】 1.选在自己需要安装的安装包版本,wget命令下载到服务器响应目录 http://php.net/releases/ 2.解压安装包 tar zxf php-x.x.x 3.cd到解压目录执行如下操作 cd ../php-...

硅谷课堂 ⋅ 今天 ⋅ 0

Nginx服务架构初探(四):nginx服务器的rewrite功能

nginx服务器的rewrite功能 1.nginx后端服务器组的配置 1>upstream name {…} name是给服务器组限的组名 2>server address [parameters]; address为服务器地址 parame......

余温灬未存 ⋅ 今天 ⋅ 0

layer.prompt使文本框为空的情况下也能点击确定

最近一直在使用layui,但是用到弹出层layer.prompt时,如果文本框是空的话点击确定没有反应,不能向下执行。 但是我又需要空值,看看我原来的代码。 123456789 layer.prompt...

孟飞阳 ⋅ 今天 ⋅ 0

Linux普通文件压缩工具gzip、Bzip2、xz

第六章 文件压缩和打包 6.1 压缩打包介绍 Linux环境常见压缩文件类型: .zip,.gz,.bz2,.xz, .tar.gz,.tar.bz2,.tar.xz 压缩打包的目的 方便文件传输 节省磁盘空间 减少传输花费的时间 ...

弓正 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部