具有不确定性依赖性的问题
您设置了一个新的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.json
,npm-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.json或npm- shrinkwrap.json文件。
- 您应该将包锁提交给VCS。
- 使用以下命令使模块保持最新状态
npm outdated
提示#3使用npmvet。确实,管理本地安装的npm软件包版本非常有用。