npm 对等依赖检查

Posted

技术标签:

【中文标题】npm 对等依赖检查【英文标题】:npm peer dependency check 【发布时间】:2016-12-25 22:18:16 【问题描述】:
$ npm install
my_module@0.0.1 /Users/antpaw/my_module
├── my_module@0.0.1 
└── UNMET PEER DEPENDENCY request@^2.74.0

npm WARN my_module@0.0.1 requires a peer of request@^2.74.0 but none was installed.

我不明白这怎么可能只是一个警告。如果未安装“请求”并且我的应用程序将崩溃,这对我的应用程序来说是一件大事。

如果未满足对等依赖关系,或者有类似npm do-i-have-everything-i-need-installed 的命令将以1 退出,我如何使npm install1 退出?

【问题讨论】:

几乎按照设计工作;如果您希望在使用 dependency 时安装模块时安装依赖项。如果您想让消费者管理安装了哪个版本的request,那么您可以使用peerDependency。这种方式安装只需两步;如果您安装失败,而不是三个...您最好将dependency 设置为主要版本:即“2.x”,这样它将被安装,但在消费者机器上进行了重复数据删除。密切相关:***.com/questions/35207380/… 【参考方案1】:

有一个工具可以让我检查兼容的依赖版本。 看看https://www.npmpeer.dev/

【讨论】:

【参考方案2】:

您最有可能使用 npm@3(版本 3)。

如文档中所述,在大多数情况下,npm 版本 1 和 2 用于安装 peerDependencies。 Npm 版本 3 改变了这种行为,不再安装 peerDependencies,而是在未安装 peerDependencies 时抛出警告。

npm 版本 1 和 2 将自动安装 peerDependencies 如果它们没有明确地依赖于依赖树中的更高层。在 npm (npm@3) 的下一个主要版本中,情况将不再如此。您将收到一条警告,提示您未安装 peerDependency。

更改背后的原因主要是为了避免在使用 peerDependencies 或大多数时候错误使用 peerDependencies 时出现依赖关系地狱。 npm Github 上存在许多关于 peerDependencies 的问题,例如 this one,解释了一些问题以及导致解决方案不再安装 peerDependencies 的原因。

如果您的应用程序在未安装 request 的情况下崩溃,那么您通常需要它。目前,在npm环境中,dependencies是你require()的包,devDependencies是你require()的包,仅供开发、测试等使用。

peerDependencies 最初设计用于解决大多数“插件”用于其他框架或库的包的问题,​​旨在与另一个“主机”包一起使用,即使它们不是直接的使用或需要“主机”包。

例如,Grunt 插件旨在与 Grunt 一起使用,但绝不是 require('grunt');。将grunt 添加为dependencies 将导致下载的包的新副本永远不会被使用。即使某些插件直接依赖于'host'包并在dependencies中指定'host'包,也会导致'host'包的多个副本。

peerDependencies 表示一个包在插入“主机”包的一个版本时可以工作,所以如果你安装了这个包,也应该安装这个其他包手动。

这是您当前的行为,您正在安装应用程序,将 request 列为 peerDependencies,因此您应该安装它以使其正常工作并删除警告,否则,您需要转到经典的dependencies

【讨论】:

“peerDependencies 是一种说法,当一个包插入到一个‘主机’包的一个版本时,它可以工作”。确切地。所以我的问题仍然是:这怎么可能是一个警告? NPM 知道我的主机包已损坏并警告我(退出 0)? peerDependencies当前 点现在是让最终用户管理和安装它以避免依赖关系地狱。它只会在peerDependencies 丢失并且您应该安装它时警告您,它不会为您完成。获得自动安装的唯一方法是远离peerDependencies 这是一个很好的观点,问题在于该观点的执行。我不想通过dependecies 自动安装,因为我最终可能会安装相同模块的两个或多个不同版本,这对我的用例来说真的很糟糕(有很多用例这不是问题) .这就是我使用peerDependencies 的原因。 “......丢失了,你应该安装它......”“我应该做的事情”是一个警告,对我来说没有任何意义? 我的回答主要是基于解释新行为以及为什么目前您无法避免它。我并不是说更改是一件好事,或者仅警告是一个不错的选择(这甚至不应该在 SO 上讨论,而是在他们的 GH 上讨论更多)。我链接的一个(许多)问题是一个完美的例子,为什么它有帮助但它根本不完美。我为这个用例找到的唯一不好的“解决方法”并且还支持 npm@2 和 npm@3 是将所有 peerDependencies 欺骗为 dependencies 并在安装后挂钩中运行 npm dedupe。跨度> 好的,我现在明白你的意图了。但是我还是觉得要么需要包,所以必须安装,要么不需要包,那为什么要声明为任何类型的依赖呢?【参考方案3】:

看起来我找到了一种使用1 退出的方法,在执行一般npm install 之后/之前(我认为顺序无关紧要)我需要运行npm install my_module,它将以@ 退出987654324@。这意味着我可以定义一个模块列表,以确保在我的 CI 脚本中准确地包含它们需要的内容(在 peerDependencies 中定义),虽然不是很漂亮,但总比没有好。

因此,无论您将在 package.json 中定义什么样的依赖关系,npm install 都不会中断。如果您的 package.json 中有废话,npm install module_name 将中断。

【讨论】:

以上是关于npm 对等依赖检查的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 npm 中为插件使用对等依赖项?

npm 对等依赖意外失败

在 npm 包中使用对等依赖项

如何识别哪些 npm 包只是对等依赖项?

安装拉力编码依赖项时未安装 NPM 警告所需的对等依赖项

为什么在npm中使用插件的对等依赖?