我正在阅读一篇有关流行的npm软件包(左键盘)的作者在删除软件包后如何导致应用程序崩溃的文章。
怎么可能呢? npm install --save
时不是在本地下载npm软件包的代码吗?我认为这是一个问题的唯一情况是,那些通过CDN使用该项目的人。我的假设正确吗?
src文章:https://www.theregister.co.uk/2016/03/23/npm_left_pad_chaos/
答案 0 :(得分:3)
node_modules
文件夹通常不上传到源控件(如Git或SVN)上。它通常是一个笨拙的文件夹,每次都要推/拉它会很麻烦。
加上一些模块包含C ++代码,并在安装到用户OS时进行编译。我的操作系统可能与安装它的用户不同,因此,如果我从源代码管理中盲目下载他自己的模块编译版本,则该模块将无法工作。
代替一个小的配置。其中包含package.json
之类的文件,该文件描述该项目所需的模块。当您运行$ npm install
时,程序包管理器(npm或yarn)将读取该文件并开始下载其引用的模块。
每次部署或克隆项目时,机器都会从其存储库中下载源代码,但会不带模块(因为它们不在源代码控制中),然后由人或机器运行$ npm install
还会获取依赖/必需的模块。
现在,项目一直一直部署在远程服务器上;即将项目部署到生产服务器,或者将其测试运行在远程CI server上,甚至由其他开发人员在其本地计算机上克隆。我从事的项目每天至少要进行5次在远程CI服务器上的部署和测试;每次我们将提交推送到远程存储库时。
自从用户删除了他的依赖性模块以来,全球许多$ npm install
都开始失败。很多人无法将更新推送到其生产服务器上的项目,其他开发人员也无法在其计算机上获取该项目,因此他们可以在该项目上进行工作...
作为对这些问题的保护措施,npm引入了a policy,禁止取消发布超过72小时的模块:
来自npm:
注册数据是不可变的,这意味着一旦发布,程序包就无法更改。我们这样做是出于依赖那些软件包的用户的安全性和稳定性的考虑。因此,如果您曾经在1.1.0版中发布过一个名为“ bob”的软件包,那么在该版本中就不会再发布具有该名称的其他软件包。即使该程序包未发布,也是如此。但是,由于发生意外,我们为用户提供了72小时的窗口来取消发布他们刚刚创建的软件包。