根据npm的创建者 Isaac Z. Scheduler所述 ,两天前npm的注册表开始报告每分钟有数以百计的编译失败。全世界的用户都不能安装或编译特定的Node.js包。有几千个依赖包损坏,包括Babel、Atom、Ember、React Native和许多其他依赖于line-numbers而不能使用的包。发生了什么?
软件工程师 Azer Koçulu 是273个Node.js依赖包的作者,其中包括 kik 和 left-pad ,left-pad是一个11行的用来在左边填入字符串的方法。几周前, Kik 联系了Azer。这个公司开发了一个拥有27000万用户的通信应用,并且在许多国家使用自己的名字注册了商标。他们打算用自己的名字发布一个npm包,但是发现以此命名的包已经存在。所以他们联系了Koçulu来寻求一个友善解决此问题的方法,但是他们意见没有统一。Kik公司联系了npmjs来解决这个冲突,如 Dispute Resolution 中详细说明。npmjs表示支持Kik,因为他们有很大数量的用户:
这个决策的首要目标是:给npm用户提供他们所希望的包。这包括了滥发、网域抢注、令人误解的包名字,还有许多例如这次的更复杂的情况。在此基础上,我们总结出,名为“kik”的包应该被Kik公司所有,并通知了双方这个决定……
考虑到两个包在竞争kik这个名字,我们相信,大量输入npm install kik的用户将会十分困惑,他们中可能会有超过20000万用户收到与通信应用没有关系的代码。
所以,npmjs决定将包名的所有权转交给Kik公司。Koçulu对结果不是很满意,他写道:
这样的情况让我感觉到NPM是某人的私人领土,在其中,公司比个人更强大,而我做开源的软件是因为[它给予]人们力量。
并且,他还决定将他所有的模块都下架,包括kik和left-pad,这是一个完全没有预料的决定,并且npmjs也没有做好准备。因为许多重要的包通过line-numbers依赖于left-pad,所以编译失败了。他们本身预期的行动是Koçulu将他的包版本0.0.3保留在注册表中,然后Kik在同一名下用一个不同的版本号加入他们自己的包,例如1.0.0。那么所有依赖于0.0.3版本的包则可以如往常一样正常运转。
为了尽快修复这个问题,npmjs决定重新发布left-pad,因为“left-pad是开源的,并且我们允许任何人使用已弃用的包名,只要他们不再使用同一个版本号”。接下来很快npm的生态系统就恢复到了正常状态。为了避免将来再发生同样的情况,npmjs决定将来将包变得更难下架,或令恶意使用已弃用的包名变得更难。但是这还留下了一些问题。
Koçulu决定停止在npmjs上发布他的工作,并且希望“开源社区能最终为NPM开设一个真正自由的环境”。他还为他的行为所造成的影响道了歉。很多人分享了他在 Twitter 、 Hacker News 、 Reddit 或其他网站上的定位。有些人渴望有一天能像Koçulu一样 “破坏Internet” ,但是也有一些其他人认为他的行为是不负责任的。 JavaScript的生态系统脆弱吗? 有人同意这个观点,其他人则举了这次的例子作为反驳,他们强调了在问题出现的时候npmjs能被修复的速度之快。有些人则质疑人们是不是忘记了如何编程。因为他们依赖于一个任何人都能在几分钟之内写出来的11行代码的包。
并且,依赖于一个独立集中式的库安全吗?有些人提出了一个 分散式的模块推送 系统。也许最近的事件将会促使社区做一些这方面的改变。
查看英文原文: NPM was Broken for 2.5 Hours
感谢张龙对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号: InfoQChina )关注我们。