「如何实现流动式软件发布」线上课堂开课啦,快来报名参与课堂抽奖吧~ 了解详情
写点什么

NPM 中断了 2.5 小时

2016 年 4 月 17 日

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

2016 年 4 月 17 日 19:001401
用户头像

发布了 26 篇内容, 共 56882 次阅读, 收获喜欢 1 次。

关注

评论

发布
暂无评论
发现更多内容

【MindSpore有奖活动】资讯内容宝藏多,编译安装试一波!

Geek_6cdeb6

网络攻防学习笔记 Day53

穿过生命散发芬芳

网络攻防 6月日更

你会选做通才还是专才?

石云升

职场经验 6月日更

Linux之mv命令

入门小站

Linux

采访华为服务器OS首席架构师熊伟:开源背后的故事(采访提纲)

xcbeyond

采访提纲 6月日更

用VSCode刷LeetCode

IT蜗壳-Tango

6 月日更

一文带你了解什么是HTTP协议

网络安全学海

网络安全 安全 信息安全 HTTP 渗透测试

在线URLEncode编码,URLDecode解码工具

入门小站

工具

信息安全与网络安全的关系

网络安全学海

网络安全 安全 信息安全 渗透测试 程序员、

【21-16】PowerShell循环

耳东

PowerShell 6 月日更

定点数与浮点数表示

若尘

浮点数 计算机组成原理 六月日更

模块7作业

Geek_2e7dd7

架构训练营

Java8 的时间库(2):Date 与 LocalDate 或 LocalDateTime 互相转换

看山

Java 6 月日更

“布”道AI的正确打开方式

脑极体

Redis入门五:主从复制

打工人!

redis 主从复制 6 月日更

值得收藏的15个JavaScript语句

devpoint

JavaScript array 6 月日更

[译] R8 优化:方法的 Outlining 优化

Antway

6 月日更

5分钟速读之Rust权威指南(二十八)RefCell<T>

码生笔谈

rust

clickhouse 通过 SummingMergeTree优化查询

张sir

Clickhouse

微信小程序开发(一)

空城机

微信小程序 前端 6月日更

知乎上线1小时,5w浏览量被下架的JVM全解笔记,内容太强大

Java架构师迁哥

分布式锁相关探索

PCMD

redis 分布式锁 zookeeper分布式锁 redisson 分布式锁

Java线程状态与状态间的切换

Geek_571bdf

Java 线程 JVM 操作系统 并发

Jenkins 如何与 Kubernetes 集群的 Tekton Pipeline 交互?

张晓辉

Kubernetes 云原生 jenkins Tekton CI/CD

协同过滤推荐算法(十六)

数据与智能

推荐算法

详解 SQL 中的单表查询

悟空聊架构

sql 6 月日更 单表查询 T-SQL

Kubernetes手记(20)- HeapSter监控

雪雷

k8s 六月日更

指挥中心情指勤一体化解决方案,河北公安情指勤一体化建设

13823153121

网络抓包实战06——灵异事件的始作俑者:Reset数据包

青春不可负,生活不可欺

Java内存模型

Geek_571bdf

Java JVM happens-before 并发 Java内存模型

只把华为“桑田岛时间”看做一档对话节目?格局小了!

脑极体

NPM中断了2.5小时-InfoQ