問題背景
今天遇到一個問題:安裝Webpack 3.x之后其它包提示peerDependencies WARNING瀑罗,意思是包版本不兼容。
【難題】雖然NPM已經(jīng)很自動化了著洼,但依賴問題真的是一個難題驮吱,無法自動解決,需要人工干預調整酬蹋。StackOverflow上的這篇問答也說了該問題無法自動處理及老。
【解決辦法】去查各個版本的依賴關系,人工調整版本號范抓。每個包的依賴關系都是放在package.json里面的骄恶,一個個版本去看當然很麻煩,這里介紹一個小技巧匕垫。
問題重現(xiàn)
例如我們現(xiàn)在安裝了Webpack 3僧鲁,package.json如下:
{
"devDependencies": {
"webpack": "^3.0.0",
}
}
但是安裝npm install --save-dev sass-loader
的時候報錯了,
錯誤比較明確說了sass-loader需要依賴新版的webpack象泵,但是安裝的webpack偏舊:
peerDependencies WARNING sass-loader@^8.0.0 requires a peer of webpack@^4.36.0 but webpack@3.12.0 was installed
解決步驟
現(xiàn)在我們需求明確要用Webpack 3寞秃,那只能讓sass-loader降級了,問題是降到哪個版本呢偶惠?這里我們通過npm view
命令來幫助我們尋找合適的版本春寿。
- 首先敲
npm view sass-loader versions
,這會告訴我們sass-loader一共有哪些版本:
$ cnpm view sass-loader versions
[
'0.0.1', '0.0.2', '0.1.0', '0.1.1',
'0.2.0', '0.3.0', '0.3.1', '0.4.0-beta.1',
...
'7.2.0', '7.3.0', '7.3.1', '8.0.0'
]
- 然后我們敲
npm view sass-loader@8.0.0 peerDependencies
忽孽,可以看到果然sass-loader 8.0.0依賴了webpack 4.36.0:
$ npm view sass-loader@8.0.0 peerDependencies
{
webpack: '^4.36.0',
'node-sass': '^4.0.0',
sass: '^1.3.0',
fibers: '>= 3.1.0'
}
- 為了找到能用的舊版绑改,我們只能一個個版本檢查谢床,例如我們看看sass-loader 7.3.1能不能用:
$ cnpm view sass-loader@7.3.1 peerDependencies
{ webpack: '^3.0.0 || ^4.0.0' }
- 可以看到sass-loader 7.3.1是能兼容webpack 3.x的,那么我們就找到了厘线,然后我們可以修改package.json识腿,將兼容的版本填入:
{
"devDependencies": {
"sass-loader": "^7.3.1",
"webpack": "^3.0.0"
}
}
總結
當遇到版本依賴問題時,只能人工處理造壮。
可以利用npm view <pkgname> [field]
快速查看package.json的某個字段覆履,也可以加上版本號使用npm view <pkgname>@version
,如果不知道一共有哪些歷史版本可以敲npm view <pkgname> versions
费薄。npm view的用法見官網(wǎng)文檔硝全。
人工尋找版本是不可避免的,為了提升效率可以:
- 結合二分法快速縮小范圍
- 然后嫌國內網(wǎng)速慢可以用
cnpm
替代npm
- 版本號可以指定一個范圍楞抡,例如:
npm view bootstrap@^4.0.0