为何部分依赖无法通过npm安装却可用Bower?angular-jk-carousel安装异常问询
先处理你遇到的npm安装警告问题
你执行npm install angular-jk-carousel后看到的UNMET PEER DEPENDENCY提示,本质是这个组件要求你的项目必须已安装符合版本范围的angular和jquery,但当前项目里要么没装这两个包,要么版本不满足要求(angular需要^1.2.0,jquery需要>=1.8.0)。
解决方法很直接:
- 手动安装满足版本要求的依赖包:
执行完这个命令后,再查看依赖树,那些未满足的peer依赖警告就会消失,组件也能正常使用。npm install angular@^1.2.0 jquery@>=1.8.0 --save - 如果项目里已经有angular和jquery,先检查
package.json里的版本号是否在组件要求的范围内,若版本不匹配,调整版本号后重新运行npm install即可。
关于npm与Bower安装依赖差异的原因
这两个工具在依赖处理逻辑上有不少核心区别,才会出现“一个能顺利安装、一个抛出警告”的情况,主要原因如下:
Peer依赖的校验严格度不同
npm对peer依赖的校验非常严格,会明确检查项目是否已提供符合要求的依赖包,一旦不满足就会抛出警告;而Bower对peer依赖的处理宽松得多,它只会提示你需要安装哪些依赖,不会阻止组件本身的安装流程,所以你用Bower能顺利完成安装。依赖安装策略有差异
npm(从3.x版本开始)会尽量采用扁平化安装依赖,减少重复包的出现,这会让依赖冲突、版本不兼容的问题更容易暴露;而Bower是嵌套式安装每个包的依赖,每个组件的依赖都放在自身目录下,就算存在版本冲突也可能被隐藏,不会影响组件安装。包维护与版本同步问题
部分组件在npm和Bower仓库中的版本可能不一致,或者维护状态不同——比如某个组件在npm上更新了依赖要求,但Bower上的版本还停留在旧配置,反之亦然。这就导致同样的安装命令,在两个工具下遇到的依赖要求不一样。版本解析规则的细微差别
虽然npm和Bower都遵循语义化版本规则,但对^、~等版本符号的处理有细微差异,这会导致同样的版本要求,在两个工具下安装的依赖版本不同,进而出现安装结果的差异。
内容的提问来源于stack exchange,提问作者iUbaid

