npm同侪依赖检查

17
$ 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.

我不明白为什么这只是一个警告。如果 "request" 没有安装,我的应用程序就会崩溃,对于我的应用程序来说这是个很大的问题。

如果同行依赖未满足或存在问题,如何使 npm install 退出并显示 1?或者是否有类似 npm do-i-have-everything-i-need-installed 命令可以退出并显示 1


基本上按设计工作;如果你希望在安装你的模块时安装依赖项,那么使用 dependency。如果你希望消费者管理安装的 request 版本,则使用 peerDependency。这种方式只需要两个步骤,而不是三个步骤,如果安装失败的话... 你最好将 dependency 设为主要版本:例如 "2.x",这样它就会被安装,但在消费者机器上进行去重。相关链接:https://dev59.com/aVsW5IYBdhLWcg3wQVRC - Meirion Hughes
2个回答

5

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

根据文档规定,npm版本1和2通常会安装peerDependencies。Npm版本3更改了这种行为,不再安装peerDependencies,而是在未安装peerDependencies时抛出警告。

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

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

如果您的应用程序在未安装request时崩溃,那么您大多数情况下是需要它的。目前,在npm环境中,dependencies是您 require()的包,devDependencies是您仅用于开发、测试等的require()包。 peerDependencies最初是为解决问题而设计的,这些问题主要涉及那些大多数是其他框架或库的插件,旨在与另一个“宿主”包一起使用,即使它们没有直接使用或需要“宿主”包。
例如,Grunt插件旨在与Grunt一起使用,但从不 require('grunt'); 。将 grunt 添加为 dependencies 会导致下载新的包副本,但该副本永远不会被使用。即使某些插件直接依赖于“宿主”包并在 dependencies 中指定了“宿主”包,也会导致多个“宿主”包的副本。 peerDependencies是一种说明包可以在“宿主”包的某个版本中正常工作的方式,因此如果您安装了这个包,则应该手动安装这个其他包。这就是您目前的行为,您正在安装您的应用程序,并将request列为peerDependencies,因此您应该安装它以使其正常工作并删除警告,否则您需要转向经典的dependencies

1
peerDependencies是一种说法,即一个软件包在插入“宿主”软件包的某个版本时可以正常工作。没错。那么我的问题仍然是:这怎么可能成为一个警告?NPM知道我的宿主软件包已经损坏,并向我发出警告(退出0)? - antpaw
1
当前 peerDependencies 的目的是让最终用户管理和安装它,以避免依赖地狱。如果缺少 peerDependencies,它只会警告您应该安装它,而不会自动为您完成安装。唯一获得自动安装的方法是远离 peerDependencies - HiDeoo
这是一个很好的观点,问题在于如何执行。 我不希望通过“dependencies”的自动安装,因为我可能会安装两个或更多不同版本的同一模块,这对我的用例来说非常糟糕(有许多用例不是问题)。这就是为什么我使用“peerDependencies”。 "...缺失并且您应该安装它..." “something-I-should-do”怎么成了警告呢? 这对我来说没有任何意义? - antpaw
我的答案主要是围绕解释新行为以及目前为什么无法避免它。我并不是说这种变化是好事,或者只有警告是一个好选择(这甚至不应该在SO上讨论,而是更多地在他们的GH上)。我链接的问题之一(众多问题中的一个)是一个完美的例子,说明它有所帮助,但它还远非完美。我发现的唯一不好的“解决方法”是将所有的peerDependencies复制为dependencies,并在安装后运行npm dedupe。同时支持npm@2和npm@3。 - HiDeoo
好的,我现在明白你的意图了。但我仍然认为要么需要该软件包,因此必须安装它,要么不需要该软件包,那么为什么要将其声明为任何类型的依赖项呢? - antpaw
这绝对是我读过的关于peerDeps最好的解释之一。 - Shanimal

3
看起来我已经找到了一种使用1退出的方法,在进行通用的 npm install 之前/之后(我认为顺序不重要),我需要运行 npm install my_module,这将以1的方式退出。这意味着我可以在CI脚本中定义要确保拥有的模块列表,以便精确地获取它们所需的内容(在 peerDependencies 中定义),虽然不太美观,但总比没有强。
因此,无论您在package.json中定义了什么样的依赖关系荒谬,npm install都不会中断。如果在package.json中定义了无意义的东西,npm install module_name 将会中断。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接