如何看待 Azer Koçulu 删除了自己的所有 npm 库?

// Quora 连动:quora.com/unanswered/Wh // Azer 文章简要翻译(by justjavac):开发者对 npm 公司不满,unpublish 了自己的所有模块 // Azer NPM 撤包事件全信件(中文翻译):【特辑】 Azer NPM 撤包事件全信件 - 【辞客堂】 - 知乎专栏 看到阮一峰老师发的Twitter: 今天凌晨,一个开发者对NPM公司不满,unpublish了自己的所有模块。其中包括被广泛使用的left-pad,导致Babel、ReactNative、Ember等大量工具构建失败。目前,Bab…
关注者
1088
被浏览
28441

54 个回答

看来npm并不认为他们有任何过错

It was abrupt unpublishing, not our resolution policy, that led to yesterday’s disruptions.

他们认为Azer的unpublishing是鲁莽和粗暴的,但Kik公司在邮件中的赤裸裸的威胁是和平友好足够尊重的。我在推上给npm的CEO issac同志回复了一个bullshit,然后被他拉黑了,哈哈。

今后即使我仍然不得不继续使用npm,但我绝不会向npm发布任何代码,也一定会尽可能支持将来可能出现的npm的替代服务。当然,我说这个话是很轻松的,因为我并不是专业前端。如果将来我可能会专注于前端工作的话,那我一定会谋求推动一个npm的替代服务。

-----------------------------------------
这是一个令人震惊的事件,如果稍后npm公司方面不出来正式道歉的话,那么社区一定会寻找npm的替代方案的,不会再有任何人相信npm了。

如果道歉的话,也许,只能说是也许,npm还有挽回的机会。

补充,npm恐怕已经完蛋了。。。

The fact that this is possible with NPM seems really dangerous. The author unpub...
The fact that this is possible with NPM seems really dangerous. The author unpublished (erm, "liberated") over 250 NPM modules, making those global names (e.g. "map", "alert", "iframe", "subscription", etc) available for anyone to register and replace with any code they wish.

Since these libs are now baked into various package.json configuration files (some with 10s of thousands of installs per month, "left-pad" with 2.5M/month), meaning a malicious actor could publish a new patch version bump (for every major and minor version combination) of these libs and ship whatever they want to future npm builds. Because most package.json configs use the "^1.0.1" caret convention (and npm --save defaults to this mode), the vast majority of future installs could grab the malicious version.

  • npm left-pad模块删除事件始末梳理事件起因

事件原因是在23日凌晨,一个开发者因为对NPM不满,unpublish了自己的所有模块。其中包括被广泛使用的left-pad,导致Babel、ReactNative、Ember等大量工具构建失败。

left-pad 是一个依赖度非常高的仓库,根据 NPM 的统计显示,left-pad 在23日时统计显示昨日的下载量是 10 万,上周的下载量为 57 万,上个月下载量达到了 255 万。

之后left-pad作者Azer在medium发布了一篇博文来阐述他删除自己模块的原因
I’ve Just Liberated My Modules

这里参考justjavac提供的翻译文章如下:

作者在《I’ve Just Liberated My Modules》文章中写道:

几个星期前有位专利律师给我发了一封电子邮件,要求我取消发布 NPM 上的 “KIK” 模块。我的回答是“不”,于是他回复我说:“I don’t wanna be dick about it(这句就不翻译了,你只需要知道 dick 是什么意思就够了),但 “KIK” 是我们的注册品牌,并且我们的律师遍布世界各地。”

当我开始编写 kik 时,并不知道有同名的公司。而我也不希望因为这个公司而被迫改变项目的名字。在遭到了我的拒绝后,他们联系了 NPM 的技术支持,为了强调他们的律师权力,每一个电子邮件都抄送给了我。在未经我允许的情况下,@izs 更改了此模块的所有权。

鉴于此我才意识到,NPM 是某个人的私有地盘,他比其他人有更多的控制权,但是我是做开源的,因为权力属于人民。(Power To The People 是约翰·列侬的同名歌曲)

概述一下就是; NPM 不再是我分享开源工作的地方,所以,我取消了曾经发布的所有模块)。(一共取消了 273 个)

这不是一个下意识的行为。我喜欢开源,相信开源社区将最终创造一个真正自由的 NPM。

如果你的项目因此而构建失败,我向你道歉。你可以在仓库(azer/dependency)指出你的依赖,或者如果你自愿参加我的 Github 上的任何模块,我会高兴地转移所有权。

干杯,再见。

  • npm模块依赖的生态环境

之后有人对left-pad源码进行查看惊讶的发现其源码仅有11行:

module.exports = leftpad;
function leftpad (str, len, ch) {
  str = String(str);
  var i = -1;
  if (!ch && ch !== 0) ch = ' ';
  len = len - str.length;
  while (++i < len) {
    str = ch + str;
  }
  return str;
}

于是一部分的人产生了疑问:为什么这么短的代码,也能成为众多库比如 RN 的依赖?

之后Haney的一篇博文对类似这样的模块进行了更多的搜索,发现了相当多类似left-pad这样的模块。提出了疑问:我们都忘记了怎样去写程序了吗?原文在此NPM & left-pad: Have We Forgotten How To Program?
这里简单翻译一下他列举的事实给大家:

好的开发者们,接下来是一个比较严肃的讨论。正如你们可能已经知道的那样,这一周里babel,react以及类似一大堆高依赖的模块在npm无法被成功构建。他们宕机的原因是相当惊人的。

因为他们共同依赖了一个简单的NPM包left-pad,它的目的是实现左填充一个字符串,他的源码也总共只有11行。
令人担心的是这里有这么多包选择去依赖一个这样简单的函数,而不是采取几分钟去写一个这样的基本功能。

由于这次灾难,我开始调查整个NPM的生态系统。这里果然有一些类似的事情:

  • 有一个叫IsArray的包,每天达到88万的下载量,而它的源代码仅有一行:
    return toString.call(arr) == '[object Array]';
  • 有一个判断是否为正数的函数is-positive-integer ,源代码只有4行,截至昨日仍然有3个项目依赖使用。后来作者重构了它依赖才变为0
  • 一个全新安装的babel包,包含了41000个文件
  • 一个空白的jspm/npm-based 应用模板起始就包含了28000个文件
    **这些都让我感到相当惊讶。难道我们都忘记了怎样编程了吗?
  • 看法

这次的危机算是一个潜在问题的大爆发,的确现在模块依赖是大势所趋,如果大量的基础函数可以通过外部依赖解决,那么我们自己的程序的代码行数就可以减少很多,程序员们也可以专注于写一些新的不同的东西。这种思想肯定是没有问题的。


而类似Haney所列举的这些简单依赖包能够产生的原因正是因为标准函数库存在不足。让任何人都必须写一个左填充的字符串函数是十分荒谬的。


另外其实npm对于解决这种包名纠纷也是有很明确的规则npm-disputes。我觉得其实NPM官方的处理也不能说有太大的问题。


类似这样的事件我认为最需要解决的两件事是

  1. - 语言能够提供一个足够健壮和充分的标准库函数,这是解决这样的问题的一个重要关键。
  2. - NPM应该尽快解决类似这种危机的处理,出现这种问题的原因也一部分在于NPM目前没有应对这种问题的机制,应当尝试修改unpublish包的规则、依赖项目如果缺失尝试寻找更多的替代品,防范其他人伪造同名库等。

  • 后续

npm今日在官方宣布,由于昨天的事件,今后将严格限制 unpublish 命令。并且,不再允许自由认领已经废弃的模块,必须向 npm 官方提出申请。

为什么?