npm install 两个依赖包的Peer Dependencies冲突该怎么解决?

问题描述

我的项目(npm:3.10.10,nodejs:6.10.3)中有两个Nodejs依赖包依赖了同一个子依赖包的不同版本,如下:

npm WARN browserify-shim@2.0.10 requires a peer of browserify@>= 2.3.0 < 4 but none was installed.

npm WARN karma-browserify@5.1.1 requires a peer of browserify@>=10 <15 but none was installed.

如果我安装 browserify 2.3.0 版本:

npm install browserify@2.3.0

就会报:

npm WARN karma-browserify@5.1.1 requires a peer of browserify@>=10 <15 but none was installed.

如果此时我再安装browserify 10.0.0 版本:

npm install browserify@10.0.0

又会反过来报:

npm WARN browserify-shim@2.0.10 requires a peer of browserify@>= 2.3.0 < 4 but none was installed.

总而言之,这两个依赖我只能选一个安装,所以,我的问题是,如何解决这个Peer Dependencies冲突

问题重现

1、需要npm 3.0以上
2、新建一个文件夹,在里面新建一个package.json文件,把下面内容复制到文件中:

{
  "name": "test",
  "version": "1.0.0",
  "devDependencies": {
    "gulp-browserify": "^0.5.1",
    "karma": "1.7.0",
    "watchify": "~3.9.0",
    "karma-browserify": "^5.1.1"
  }
  
}

3、运行安装,问题就会出现

npm install

可能方案

搜索npm PEER DEPENDENCY ,然后找到了npm 官网对于peer dependency 的描述,中文版看这里,但是没看明白它是怎么用的,还请指教

阅读 39.4k
2 个回答

解决方案

最终,在 官网 看到这么一句:

Trying to install another plugin with a conflicting requirement will cause an error. For this reason, make sure your plugin requirement is as broad as possible, and not to lock it down to specific patch versions

大意是:如果依赖(指peer dependencies)的冲突导致出错,则尝试安装另外一个(无冲突的版本)。所以,在写自己的插件时,对依赖的限制要尽量宽松,不要绑死到一个确定版本上。

由于插件不是我们写的,我们能做的,就是换一个不冲突的版本,比如,把karma-browserify@5.1.1换成karma-browserify@4.4.2,冲突就解决了:

{
  "name": "test",
  "version": "1.0.0",
  "devDependencies": {
    "gulp-browserify": "^0.5.1",
    "karma": "1.7.0",
    "karma-browserify": "4.4.2",
    "watchify": "~3.9.0"
  }
}

注意:如果你只是出现了npm WARN AAA@1.0.0 requires a peer of BBB@>= 1.2.3 < 4 but none is installed.这样的信息,没有出现冲突,那你直接就使用:

npm install BBB@1.2.3

就可以了,至于为什么?可以看下面,理解了同级依赖(peer dependency)就会明白

解决方案分析

为什么只能安装另外一个无冲突的版本?

peer dependency是同级依赖(个人翻译)的意思,比如上面的package.json中,下面这些依赖是同级的:

    "gulp-browserify": "^0.5.1",
    "karma": "1.7.0",
    "karma-browserify": "4.4.2",
    "watchify": "~3.9.0"

如果在karma-browserify包有同级依赖,那它依赖的包一定是上面这几个包之一,所以,当两个依赖包对某个peer dependency发生冲突时,我们只能:(1)忽略,假定冲突对我们没有影响(2)调整其中一个包的版本,使冲突不发生。因为,不可能同时一依赖包的两个版本,就像在上面的package.json中同时写上下面两句会发生错误一样:

"karma-browserify": "5.1.1",
"karma-browserify": "2.3.0",

如何找到不冲突的版本?

首先分析一下两个包冲突的peer dependency:

browserify-shim@2.0.10 requires a peer of browserify@>= 2.3.0 < 4 but none is installed. 

karma-browserify@5.1.1 requires a peer of browserify@>=10 <15 but none is installed.

我们只要在karma-browserify的历史版本中找到一个版本,其peer denpendency的browserify版本号>= 2.3.0 && < 4就行了,于是我们打开 karma-browserify/package.json文件,点history按钮,然后一个个找,发现4.4.2版本符合我们的要求,其peer dependencies如下:

 "peerDependencies": {
    "karma": ">=0.10"
  }

WARN的话可以无视,楼主使用起来是否有问题?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏