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 install
以1
退出?
【问题讨论】:
几乎按照设计工作;如果您希望在使用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 对等依赖检查的主要内容,如果未能解决你的问题,请参考以下文章