javascript - 当一个 npm 包被删除时会发生什么?
问题描述
我正在阅读一篇关于流行 npm 包(left-pad)的作者在删除他的包后如何导致应用程序崩溃的文章。
怎么会这样?npm包的代码不是在你本地下载的npm install --save
吗?我认为这是一个问题的唯一情况是那些通过 CDN 使用该项目的人。我的假设正确吗?
src 文章:https ://www.theregister.co.uk/2016/03/23/npm_left_pad_chaos/
解决方案
大多数项目不会将实际模块提交到源代码控制
该node_modules
文件夹通常不会上传到 Git 或 SVN 等源代码控制上。它通常是一个巨大的文件夹,每次推/拉它会很麻烦。
此外,一些模块包含 C++ 代码,并在安装到用户操作系统时进行编译。我的操作系统可能与安装它的用户不同,因此如果我从源代码管理中盲目下载他自己编译的该模块版本,该模块将无法工作。
取而代之的是一个小配置。包含的文件,package.json
它描述了项目需要哪些模块。当您运行$ npm install
时,包管理器(npm或yarn)然后读取该文件并开始下载它引用的模块。
每次部署或克隆项目时,机器都会从其存储库下载源代码,但没有模块(因为它们不在源代码控制中),然后人或机器运行$ npm install
以获取依赖/必需的模块。
项目一直在部署和构建
现在,项目一直部署在远程服务器上;即将项目部署到生产服务器或者它的测试在远程CI服务器上运行,甚至由其他开发人员在他们的本地机器上克隆。我从事的项目每天至少在远程 CI 服务器上部署和测试 5 次;每次我们将提交推送到远程存储库时。
由于那个用户删除了他非常依赖的模块,$ npm install
全球很多s开始失败。很多人无法将更新推送到他们的生产服务器上的项目,其他开发人员无法在他们的机器上获取项目,因此他们可以处理它等等......
为了防止这些问题,npm引入了一项政策,禁止取消发布超过 72 小时的模块:
从npm:
注册表数据是不可变的,这意味着一旦发布,包就无法更改。我们这样做是出于依赖这些软件包的用户的安全性和稳定性的原因。因此,如果您曾经在 1.1.0 版本中发布过一个名为“bob”的包,那么在该版本中就无法使用该名称发布其他包。即使该软件包未发布也是如此。但是,由于意外发生,我们允许用户在 72 小时内取消发布他们刚刚创建的包。
推荐阅读
- react-native - Expo React Native - 如何使用 ErrorRecovery?
- postgresql - 并发创建唯一索引时的 Postgres lock_timeout
- javascript - 带有 d3.js(v5)色标的谷歌地图不起作用
- python - 如何在 Django 中减去两个日期?
- javascript - ESlint 和函数或 const 中的对象扩展运算符,为什么会抱怨?
- templates - 需要使用 For 循环而不是 Azure Pipeline Template yaml 中的每个循环
- jenkins - 在多个模块上生成三叶草报告
- react-native - Shoutem cloud - 从 react-native 部分添加新项目
- r - 如何解决 pandoc 问题
- flutter - 如何将资产图像保存在手机图库中?使用 gallery_saver 插件