npm install 依赖包 报错问题及版本辅助工具

具有不确定性依赖性的问题

您设置了一个新的Node JS / Webpack项目使用npm install安装了所有依赖项,并且您的应用程序运行平稳。一周后,已指派另一位开发人员与您一起工作。因此,他/她克隆了它,并通过npm install来安装依赖项,然后他们运行该应用程序,并且突然到处都是错误!感到困惑的是,您查看了您的代码,并且代码正常工作。它们具有相同的依赖关系和相同的代码,为什么该应用程序无法在您同事的计算机上运行?

 
图片发布

答案是不良的依赖树管理这是每个开发人员都面临NPM生态系统中的常见问题

图书馆的变化和发展确实非常快,他们很少正确地进行版本控制。我谈论的不是文档和测试,而是完全不同的故事。甚至一个月大的图书馆示例代码也经常损坏,您需要搜索更改日志以找出更改的内容。

假设您对模块X @ version〜1.0.1有依赖性模块X取决于模块Y @ version ^ 1.1.0,模块Y取决于模块Z @ version ^ 1.2.0

如果模块Z决定发布新版本1.3.0,则在运行NPM install时,它将自动升级到1.3.0,因为在package.json中将其指定为^(caret)重要的是,这是在幕后发生的,因为对您来说,您正在安装模块X ,但您无法真正分辨出模块X对模块Y和模块Z的依存关系类型。这就是有时您的项目出现的原因可以在您的计算机上运行,​​然后在几周后在其他人的计算机上失败。

 
图片发布

在继续之前,我想介绍一下NPM中语义版本控制的基础知识:

语义版本控制

SemVer非常流行,并且是javascript Universe中被滥用的软件版本控制方案。

你做对了!我说“滥用”。因为流行库的许多贡献者通常不关心或破坏语义版本控制的规则。

给定版本号MAJOR.MINOR.PATCH,增加:

  • 补丁:错误修复和其他较小更改:补丁发布,增加最后一个数字,例如0.0.1
  • MINOR:不破坏现有功能的新功能:次要版本,增加中间数字,例如0.1.0
  • 重要:更改会破坏向后兼容性:主要发行版,请增加第一个数字,例如1.0.0

附言 npm中的所有软件包都必须遵循上述规则。

由于许多贡献者没有遵循这些模式,因此又与NPM的存储规则相冲突。让我们检查一下为什么要考虑这一点非常重要。

我们知道SemVer的前缀^(caret)符号会将您更新到最新的次要版本或补丁程序级别。考虑JQuery

"jquery": "^3.0.1"

那么以下所有文件都可以由NPM自动安装:3.1.1、3.0.2、3.0.4、3.5.3等。

提示#1结帐semvem计算器

这意味着您的安装将是不确定的,因为您允许安装程序在当前时间安装与您的规则匹配的模块的版本当模块的作者由于不遵循SemVer的规则而发布错误或代码中断的更新时,这就为错误提供了巨大的空间。

作者在库API中的主要更新将被标记为补丁程序或软件包版本中的次要更新。

好。该如何处理?

你不需要。NPM@5.xx会照顾您。如果您使用的是npm ^ 5.xx,则默认情况下将为您生成package-lock.json应该将其提交给源控件,例如Git等。这是NPM @ 5的新锁定文件功能,其中包含当前依赖关系树的快照,并允许在机器之间进行可复制的构建。

您可能会想到,使用npm shrinkwrap和它可以实现相同的效果npm-shrinkwrap.json是的,你是对的。

 
图片发布

创建新文件的主要原因是为了更好地传达NPM确实支持锁定的信息,这显然是过去版本中的主要问题。

  • NPM强制执行package-lock.json从未出版,甚至你加它明确。
  • npm-shrinkwrap.json但是,文件可以是已发布程序包的一部分,即使嵌套依赖,NPM也会尊重文件

接下来,您可能想知道npm shrinkwrap在已经包含的目录中运行时会发生什么package-lock.json答案很简单,因为它们共享相同的格式package-lock.jsonnpm-shrinkwrap.json所以NPM只会重命名

太酷了,但是什么时候使用新的锁定文件而不是旧的拆封文件,反之亦然?通常取决于您正在处理的软件包的类型。

好吧,如果您正在使用其他人将依赖的公共库,则应在开发最终用户在终端中使用的软件包时使用新的锁定文件(package-lock.json)并使用npm- shrinkwrap.json例如CLI-tools..etc或捆绑的可执行文件。

提示#2您始终可以查看使用发行的软件包的外观npm pack

概要

  • 如果您使用的是npm ^ 5.xx,则默认情况下将为您生成package-lock.json
  • 如果您的应用程序提供了API,并且使用semver规则,请使用semver。
  • 不要删除 package-lock.jsonnpm- shrinkwrap.json文件。
  • 应该将包锁提交给VCS。
  • 使用以下命令使模块保持最新状态 npm outdated

提示#3使用npmvet确实管理本地安装的npm软件包版本非常有用。

 
图片发布

posted on 2021-01-15 15:21  菜鸟丫丫  阅读(877)  评论(0编辑  收藏  举报

导航