Yarn,Facebook开源一个新的Javascript包管理工具。
node
Yarn 是一个新的包管理器,用于替代现有的 npm 客户端或者其余兼容 npm 仓库的包管理工具。Yarn 保留了现有工做流的特性,优势是更快、更安全、更可靠。linux
任何包管理器的主要功能都是安装某些软件包,软件包即用于特定功能的某段代码,一般是从一个全局的仓库安装到工程师的本地环境。每一个软件包能够依赖于其余包,也能够不依赖。一个典型的项目结构的依赖树一般会包含数十个、数百个甚至上千个软件包。算法
这些依赖包一般是带版本号的,经过语义化版本控制(semver)安装。Semver 定义的版本号反映了每一个新版本更改的类型,究竟是进行了不兼容的API改动(MAJOR),仍是添加了向后兼容的新特性(MINOR),仍是进行了向后兼容的 bug 修复(PATCH)。然而,semver 依赖于软件包的开发者不能犯错误——若是依赖关系没有加锁,可能会引入一些破坏性更改或者产生新的 bug。npm
在 Node 生态系统中,依赖一般安装在项目的 node_modules 文件夹中。然而,这个文件的结构和实际依赖树可能有所区别,由于重复的依赖能够合并到一块儿。npm 客户端把依赖安装到 node_modules目录的过程具备不肯定性。这意味着当依赖的安装顺序不一样时,node_modules 目录的结构可能会发生变化。这种差别可能会致使相似“个人机子上能够运行,别的机子不行”的状况,而且一般要花费大量时间定位与解决。json
Yarn 经过 lockfiles 文件以及一个肯定性的、可靠的安装算法,解决了版本问题和 npm 的不肯定性问题。Lockfile 文件把安装的软件包版本锁定在某个特定版本,并保证 node_modules 目录在全部机器上的安装结果都是相同的。Lockfile 还使用简洁的有序键名的格式,保证了每次的文件变化最小化,进行代码审查也更为简单。
安装过程分为如下三个步骤:缓存
处理: Yarn 经过向代码仓库发送请求,并递归查找每一个依赖项,从而解决依赖关系。安全
抓取: 接下来,Yarn 会查找全局的缓存目录,检查所需的软件包是否已被下载。若是没有,Yarn 会抓取对应的压缩包,并放置在全局的缓存目录中,所以 Yarn 支持离线安装,同一个安装包不须要下载屡次。依赖也能够经过 tarball 的压缩形式放置在源码控制系统中,以支持完整的离线安装。工具
生成: 最后,Yarn 从全局缓存中把须要用到的全部文件复制到本地的 node_modules 目录中。fetch
经过清晰地细分这些步骤,以及肯定性的算法支持,使得 Yarn 支持并行操做,从而最大化地利用资源,并加速安装进程。在一些 Facebook 的项目上,Yarn 甚至能够把安装过程下降一个数量级,从几分钟到只需几秒钟。Yarn 还使用了互斥锁,以确保多个 CLI 实例同时运行时不会互相冲突与影响。版本控制
纵观整个过程,Yarn 对于软件包安装加上了严格的限制。你能够对哪一个生命周期脚本做用于哪一个软件包进行控制。软件包的 checksum 也会存储在 lockfile 中,以确保每一次安装均可以获得同一个包。
Yarn 除了让安装过程变得更快与更可靠,还添加了一些额外的特性,从而进一步简化依赖管理的工做流。
同时兼容 npm 与 bower 工做流,并支持两种软件仓库混合使用
能够限制已安装模块的协议,并提供方法输出协议信息
提供一套稳定的公有 JS API,用于记录构建工具的输出信息
可读、最小化、美观的 CLI 输出信息
sudo apt-key adv --fetch-keys http://dl.yarnpkg.com/debian/pubkey.gpg echo "deb http://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt-get update && sudo apt-get install yarn
yarn --version
yarn CLI 代替了原有开发工做流中 npm CLI 的做用,用法多是单纯的替代,也多是一个新的、类似的命令: