解決 npm 依賴(lài)沖突報(bào)錯(cuò)記錄
最近在使用 npm 安裝項(xiàng)目依賴(lài)時(shí),遇到了一個(gè)關(guān)于依賴(lài)沖突的問(wèn)題,特此記錄一下解決過(guò)程。
報(bào)錯(cuò)內(nèi)容如下
# npm resolution error report
While resolving: awesome-typescript-loader@5.2.1
Found: typescript@4.9.5
node_modules/typescript
dev typescript@"^4.4.4" from the root project
peer typescript@"*" from ts-loader@9.4.4
node_modules/ts-loader
dev ts-loader@"^9.2.6" from the root project
peer typescript@">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" from tsutils@3.21.0
node_modules/tsutils
tsutils@"^3.21.0" from @typescript-eslint/eslint-plugin@5.62.0
node_modules/@typescript-eslint/eslint-plugin
dev @typescript-eslint/eslint-plugin@"^5.3.0" from the root project
tsutils@"^3.21.0" from @typescript-eslint/type-utils@5.62.0
node_modules/@typescript-eslint/type-utils
@typescript-eslint/type-utils@"5.62.0" from @typescript-eslint/eslint-plugin@5.62.0
node_modules/@typescript-eslint/eslint-plugin
dev @typescript-eslint/eslint-plugin@"^5.3.0" from the root project
tsutils@"^3.21.0" from @typescript-eslint/typescript-estree@5.62.0
node_modules/@typescript-eslint/typescript-estree
@typescript-eslint/typescript-estree@"5.62.0" from @typescript-eslint/parser@5.62.0
node_modules/@typescript-eslint/parser
dev @typescript-eslint/parser@"^5.3.1" from the root project
peer @typescript-eslint/parser@"^5.0.0" from @typescript-eslint/eslint-plugin@5.62.0
node_modules/@typescript-eslint/eslint-plugin
dev @typescript-eslint/eslint-plugin@"^5.3.0" from the root project
@typescript-eslint/typescript-estree@"5.62.0" from @typescript-eslint/type-utils@5.62.0
node_modules/@typescript-eslint/type-utils
@typescript-eslint/type-utils@"5.62.0" from @typescript-eslint/eslint-plugin@5.62.0
node_modules/@typescript-eslint/eslint-plugin
dev @typescript-eslint/eslint-plugin@"^5.3.0" from the root project
@typescript-eslint/typescript-estree@"5.62.0" from @typescript-eslint/utils@5.62.0
node_modules/@typescript-eslint/utils
@typescript-eslint/utils@"5.62.0" from @typescript-eslint/eslint-plugin@5.62.0
node_modules/@typescript-eslint/eslint-plugin
dev @typescript-eslint/eslint-plugin@"^5.3.0" from the root project
@typescript-eslint/utils@"5.62.0" from @typescript-eslint/type-utils@5.62.0
node_modules/@typescript-eslint/type-utils
@typescript-eslint/type-utils@"5.62.0" from @typescript-eslint/eslint-plugin@5.62.0
node_modules/@typescript-eslint/eslint-plugin
dev @typescript-eslint/eslint-plugin@"^5.3.0" from the root project
Could not resolve dependency:
peer typescript@"^2.7 || ^3" from awesome-typescript-loader@5.2.1
node_modules/awesome-typescript-loader
dev awesome-typescript-loader@"^5.2.1" from the root project
Conflicting peer dependency: typescript@3.9.10
node_modules/typescript
peer typescript@"^2.7 || ^3" from awesome-typescript-loader@5.2.1
node_modules/awesome-typescript-loader
dev awesome-typescript-loader@"^5.2.1" from the root project
Fix the upstream dependency conflict, or retry
this command with --force or --legacy-peer-deps
to accept an incorrect (and potentially broken) dependency resolution.
問(wèn)題描述
在解析 awesome-typescript-loader@5.2.1
依賴(lài)時(shí),發(fā)現(xiàn)了以下依賴(lài)關(guān)系:
- 發(fā)現(xiàn)
typescript@4.9.5
,位于node_modules/typescript
。- 來(lái)自根項(xiàng)目的
dev typescript@"^4.4.4"
。 - 來(lái)自
ts-loader@9.4.4
的peer typescript@"*"
。 - 來(lái)自根項(xiàng)目的
dev ts-loader@"^9.2.6"
。 - 來(lái)自
tsutils@3.21.0
的peer typescript@">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
。
- 來(lái)自根項(xiàng)目的
- 發(fā)現(xiàn)
typescript@3.9.10
,位于node_modules/typescript
。- 來(lái)自
awesome-typescript-loader@5.2.1
的peer typescript@"^2.7 || ^3"
。
- 來(lái)自
由于這兩個(gè)版本的 typescript
存在沖突,導(dǎo)致依賴(lài)解析失敗。
問(wèn)題分析
通過(guò)上面的錯(cuò)信息我們已經(jīng)了解到可以使用 --force
或 --legacy-peer-deps
選項(xiàng)來(lái)嘗試重新解析依賴(lài)。這樣可能會(huì)接受不正確的依賴(lài)解析,但也可能導(dǎo)致破損的依賴(lài)。
另一種解決方法是嘗試修復(fù)上游的依賴(lài)沖突。這可能需要手動(dòng)調(diào)整項(xiàng)目的依賴(lài)配置,以確保所有依賴(lài)的版本能夠協(xié)調(diào)工作。
根據(jù)日志,問(wèn)題是 awesome-typescript-loader 的 peerDependencies 中指定了對(duì) typescript 的版本依賴(lài)是 "^2.7 || ^3",但項(xiàng)目中實(shí)際安裝的 typescript 版本是 4.9.5,高于指定的范圍,因此產(chǎn)生沖突。
解決方案
有幾種解決方法:
- 升級(jí) awesome-typescript-loader 到最新版本,它移除了對(duì) typescript 版本的硬性限制,可以兼容 typescript 4.x
npm install awesome-typescript-loader@latest
- 降級(jí)項(xiàng)目中 typescript 版本到 3.x 來(lái)滿足 awesome-typescript-loader 的 peerDependencies
npm install typescript@3 --save-dev
- 使用 --legacy-peer-deps 參數(shù)強(qiáng)制安裝,忽略 peerDependencies 不兼容問(wèn)題
npm install awesome-typescript-loader --legacy-peer-deps
- 如果是通過(guò) yarn 安裝,可以使用 yarn resolution 強(qiáng)制使用 typescript 4.x
yarn resolution:use-native typescript@4.x
建議使用方法 1,升級(jí)到最新版本的 awesome-typescript-loader。?
方法 2 也可以,但會(huì)失去 typescript 4.x 的一些新特性。?
方法 3 可以解決安裝問(wèn)題,但可能會(huì)引發(fā)實(shí)際運(yùn)行時(shí)的不兼容問(wèn)題。???
所以綜合來(lái)說(shuō),升級(jí) awesome-typescript-loader 是更好的長(zhǎng)期解決方案。
結(jié)論
依賴(lài)沖突是開(kāi)發(fā)過(guò)程中常見(jiàn)的問(wèn)題,解決起來(lái)可能需要一些時(shí)間和耐心。在解決依賴(lài)沖突問(wèn)題時(shí),需要注意官方文檔、社區(qū)討論以及類(lèi)似問(wèn)題的解決方法,以便找到最合適的解決方案。
希望這篇記錄能夠?qū)ζ渌_(kāi)發(fā)者在遇到類(lèi)似問(wèn)題時(shí)提供一些幫助和指導(dǎo)。如果你也遇到了類(lèi)似的問(wèn)題,歡迎分享你的解決方法和經(jīng)驗(yàn)!