首页 > 解决方案 > 当一个 npm 包被删除时会发生什么?

问题描述

我正在阅读一篇关于流行 npm 包(left-pad)的作者在删除他的包后如何导致应用程序崩溃的文章。

怎么会这样?npm包的代码不是在你本地下载的npm install --save吗?我认为这是一个问题的唯一情况是那些通过 CDN 使用该项目的人。我的假设正确吗?

src 文章:https ://www.theregister.co.uk/2016/03/23/npm_left_pad_chaos/

标签: javascriptnode.jsnpmnpm-install

解决方案


大多数项目不会将实际模块提交到源代码控制

node_modules文件夹通常不会上传到 Git 或 SVN 等源代码控制上。它通常是一个巨大的文件夹,每次推/拉它会很麻烦。

此外,一些模块包含 C++ 代码,并在安装到用户操作系统时进行编译。我的操作系统可能与安装它的用户不同,因此如果我从源代码管理中盲目下载他自己编译的该模块版本,该模块将无法工作。

取而代之的是一个小配置。包含的文件,package.json描述了项目需要哪些模块。当您运行$ npm install时,包管理器(npmyarn)然后读取该文件并开始下载它引用的模块。

每次部署或克隆项目时,机器都会从其存储库下载源代码,但没有模块(因为它们不在源代码控制中),然后人或机器运行$ npm install以获取依赖/必需的模块。

项目一直在部署和构建

现在,项目一直部署在远程服务器;即将项目部署到生产服务器或者它的测试在远程CI服务器上运行,甚至由其他开发人员在他们的本地机器上克隆。我从事的项目每天至少在远程 CI 服务器上部署和测试 5 次;每次我们将提交推送到远程存储库时。

由于那个用户删除了他非常依赖的模块,$ npm install全球很多s开始失败。很多人无法将更新推送到他们的生产服务器上的项目,其他开发人员无法在他们的机器上获取项目,因此他们可以处理它等等......

为了防止这些问题,npm引入了一项政策,禁止取消发布超过 72 小时的模块:

npm

注册表数据是不可变的,这意味着一旦发布,包就无法更改。我们这样做是出于依赖这些软件包的用户的安全性和稳定性的原因。因此,如果您曾经在 1.1.0 版本中发布过一个名为“bob”的包,那么在该版本中就无法使用该名称发布其他包。即使该软件包未发布也是如此。但是,由于意外发生,我们允许用户在 72 小时内取消发布他们刚刚创建的包。


推荐阅读