问题描述
我的项目(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 的描述,中文版看这里,但是没看明白它是怎么用的,还请指教
解决方案
最终,在 官网 看到这么一句:
大意是:如果依赖(指peer dependencies)的冲突导致出错,则尝试安装另外一个(无冲突的版本)。所以,在写自己的插件时,对依赖的限制要尽量宽松,不要绑死到一个确定版本上。
由于插件不是我们写的,我们能做的,就是换一个不冲突的版本,比如,把
karma-browserify@5.1.1
换成karma-browserify@4.4.2
,冲突就解决了:注意:如果你只是出现了
npm WARN AAA@1.0.0 requires a peer of BBB@>= 1.2.3 < 4 but none is installed.
这样的信息,没有出现冲突,那你直接就使用:就可以了,至于为什么?可以看下面,理解了同级依赖(peer dependency)就会明白
解决方案分析
为什么只能安装另外一个无冲突的版本?
peer dependency是同级依赖(个人翻译)的意思,比如上面的package.json中,下面这些依赖是同级的:
如果在
karma-browserify
包有同级依赖,那它依赖的包一定是上面这几个包之一,所以,当两个依赖包对某个peer dependency发生冲突时,我们只能:(1)忽略,假定冲突对我们没有影响(2)调整其中一个包的版本,使冲突不发生。因为,不可能同时一依赖包的两个版本,就像在上面的package.json中同时写上下面两句会发生错误一样:如何找到不冲突的版本?
首先分析一下两个包冲突的peer dependency:
我们只要在karma-browserify的历史版本中找到一个版本,其peer denpendency的browserify版本号
>= 2.3.0 && < 4
就行了,于是我们打开 karma-browserify/package.json文件,点history按钮,然后一个个找,发现4.4.2版本符合我们的要求,其peer dependencies如下: