根据 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 )关注我们。
评论