Yarn 1.0 发布啦

2017-09-08

激动人心的时刻,Yarn JavaScript 包管理工具1.0发布啦!!👏👏,这是这项工程重要的一步。在过去的11个月里,Yarn收到了一大批的粉丝关注。到目前为止已经有超过 175,000 GitHub工程 带有yarn.lock 文件. 随着大公司,小团队还有开源组织的使用, Yarn 现在已经为 每个月30亿包下载服务了. 缩短安装时间是许多用户的大难题. Twitter, 还有Microsoft 的 outlook.com, 已经可以看到有5倍的安装时间优化. Expo, Kenzan, 以及 Sentry 也表示说yarn在性能和稳定性有很大提升以至于他们可以更快的装载代码. 另外,一些主要的持续集成工具里面也预装了yarn,如 CircleCI, Travis CI, 以及 AppVeyor.

在我们Facebook内部,Yarn也应用到了许多基础代码库中,比如Facebook主app和主站,Instagram,Oculus,WhatsApp。在我们的体系里Yarn每天支持着成百上千的包的安装。它的设计是为了更好的扩展工程,即使这个工程拥有成百上千个直接或者间接的依赖。利用 offline mirror 功能我们可以更快速和安全的按成包的安装, 并且他们是可靠且可复用的,不仅可以用在每个工程师的开发机器里,也可以用到持续集成系统里面.

受到大家的欢迎,社区参与度也很不错这让我们很欣慰。一年前,当我们发布yarn的时候,我们就专注于稳定性、灵活性和高效这三个方面。基于这个让yarn成功的要素,我们带来了拥有很多新功能的1.0版本,希望能帮助Yarn社区更快速的进步、构建出强大的工程。开源社区对于这个项目的源码以及官网都给出了重要的的贡献,1.0很多功能设计和实现都来自于社区的成员。

所以, 1.0有什么干货呢:

Yarn 工作空间

我们已经看到源代码管理的单一存储库方法,由诸如Facebook等大型科技公司普及,在开源社区和小公司中慢慢获得了发展。往这种方法转移的原因,这个理念使得我们在项目之间共享代码变得容易起来,同时也避免了依赖同步的问题。 为了让人们更容易的采用这种模式,Yarn添加了一个新功能: Workspaces. 它使得人们可以自动的将来自多个package.json的依赖合并到一起,且只需要安装一次.同样只需要在根目录添加 一个yarn.lock文件就可以。 此外,Yarn会在彼此相互依赖的Workspaces之间创建符号链接,这样在所有的项目中就始终可以用到最新的代码.

Workspaces已经在Facebook的团队以及像Babel这样的开源团队使用。如果你已经在使用像Lerna这样的单一存储库管理工具,那么你也可以选择使用Yarn的工作空间了。 这个将Babel迁移到Workspaces的PR是一个很好的例子. 通过让Yarn原生支持Workspaces,我们希望能够通过避开较大项目里面的细小程序包的重复安装来更快更轻量的安装包。

自动merge lock文件

对于具有多个贡献者的快节奏项目,依赖可以在单独项目Pull Request中逐个更新。这样做就可能会导致yarn.lock文件的merge冲突。如果只有一两个包有着种情况我们通常可以直接手动解决一下,但如果有很多这种情况就会变得很乏味。

有了新的自动合并功能,当你的lock file出现冲突的时候,Yarn会在你运行yarn install的时候帮你解决冲突。如果合并成功,没有冲突的文件将被保存到磁盘里,留给你的任务就是在版本控制系统里将其标定为已解决。

这样一来,如果再有冲突你就不用费心去解决这些琐事了:

可选择的版本解决方案

有时候,软件包需要静快的修复关键bug或者是重要的安全更新。不幸的时,你的项目可能不是直接引用这个包而是通过几层的依赖来引用他们。这个时候你只能等到这个直接依赖包的更新,或者你fork一份代码来自己更新。这两个方案都不是很理想, 可选版本的解决方案就是为了解决这些问题而开发的。
现在,Yarn允许在项目的package.json中定义一个resolutions字段来告诉Yarn去按照指定版本去安装子依赖而忽视原始的依赖范式。该功能足够灵活、通用,可以 通过全局模式来定义细粒度的规则以深入到特定的间接依赖。 以下是一个实例,当你希望安装特定的子依赖async模块时候你可以看到该如何使用这个功能来实现::

还要特别的鸣谢:这个功能是由社区成员完全设计和实施的。维克多·诺尔(VictorNoël)提交了RFC验收测试,完整的端到端实施来自于Kaylie Kwon

一些bug的修复以及功能的改进

出了上面这些新功能,我们还想提及一些改进:

社区参与

没有开源社区就没有Yarn的今天。Yarn的GitHub时作为独立组织创建的, 这是组织来自多个公司合作努力,并快速的呗较大的JS社区认可和采用。

在项目初次启动之后不久,我们引入了一个RFC过程来鼓励和讨论社区的贡献。上述许多功能最初是由社区成员构思的,后来由社区成员实施。迄今为止,40多个贡献者对该项目作出了有影响的改变. 这里列举一些高光的贡献者:

接下来呢?

我们会继续Yarn的开发.以下是我们将来要看到的几个要点,如果你也感兴趣可以加入我们

Yarn 发布

维护开源项目不容易。发布一个新包通常包括几个步骤:完整的修改日志,合理的语义化版本号,在相关项目同步版本,以及其他的一些维护者或者自动脚本需要处理的步骤. 如果能让yarn支持所有使用grunt来工作的库作者是不是很厉害呢?

Package 安全

软件包审核是添加新软件包或升级旧软件包时的重要步骤。我们很高兴能够看到Yarn在增加包的可信度方面扮演的角色. 我们将和npm合作,为yarn带来双因子校验,让包安全这件事取得一些进展。

关于语义化版本(Semver)

随着1.0的发布,我们承诺不会在次要或补丁版本中发生任何突变。这个主要是我们这边需要花点精力来做这个事情,使用一些工具来简化发布流程。希望在不远的未来实现。

最后

很高兴yarn的出现,带给我们这些开发者,特别是中国区的开发者很大的便利。希望你也会喜欢,并继续关注我的专栏