我用的 yarn v4 版本,所以以下教程命令都基于yarn
這里假設我報錯的庫名字叫 XXXXXXXX,依賴他的庫叫?AAAAAAAA
排查解決思路分析:
首先查看一下 XXXXXXXX 的依賴關系,執行
yarn why XXXXXXXX
首先我們要知道 yarn 自動做了庫的拆分,所以不同的庫依賴不同的版本的某個庫是互相隔離的,我們幾乎在任何時間都不需要check這個問題,除了以下幾種問題
如果看到類似的輸出,比如一個庫依賴項是 XXXXXXXX: ^0.0.1-beta.29
,但他的?node_modules 下載的卻是 XXXXXXXX@0.0.1-local.8
└─ AAAAAAAA@npm:0.0.1└─XXXXXXXX@npm:0.0.1-local.8 (via npm:^0.0.1-bata.29)
那我們就先看下是不是本地有這個 cache 緩存
我們先看下項目里有沒有 .yarn/cache 這個文件,如果有就查看是不是命中了緩存
如果沒有這個目錄,先查看 cache 目錄在哪里
yarn config get cacheFolder
知道了緩存的目錄后,查看是否命中
ls .yarn/cache | grep XXXXXXXX
?我的輸出如下
XXXXXXXX-0.0.1-local.8-ddea0537de-10c0.zip
所以可以發現,我確實是因為命中了緩存才導致的問題,所以我們執行
yarn cache clean
yarn install
之后我發現還是沒有成功,于是檢查一下 yarn.lock 文件是否有鎖定的版本
cat ./yarn.lock | grep XXXXXXXX
我這里輸出如下,可以看到
"XXXXXXXX": "npm:^0.0.1-bata.29"
"XXXXXXXX@npm:^0.0.1-bata.29":resolution: "XXXXXXXX@npm:0.0.1-local.8"
于是我執行
yarn cache clean
rm yarn.lock
yarn install
之后我發現還是沒有解決該問題
那么幾乎可以判斷為,不是緩存問題,而是 yarn registry(包源)里這個版本就叫做 0.0.1-local.8
,并且它“偽裝”為 ^0.0.1-bata.29
的合法候選項!或者說他還沒有被注冊到 yarn regitstry 里。
也就是說,Yarn 從 遠程 registry(yarn私有源) 獲取到了一個叫:XXXXXXXX@0.0.1-local.8 的庫
但它被誤判為匹配:^0.0.1-beta.29
為什么 ^0.0.1-beta.29
能匹配 0.0.1-local.8
?
在 semver 標準里:
-
^0.0.1-beta.29
只允許 patch-level 的預發版本,如:-
0.0.1-beta.30
-
0.0.1-rc.1
-
-
但 如果 registry 中
0.0.1-local.8
是唯一匹配的預發版本,Yarn可能會選它,盡管它顯然不是正式版本。
這說明你的環境中:
🧨
0.0.1-local.8
是注冊在 yarn 或私有 registry 上的,并且是目前唯一可解的版本。
如何修復????
1.?強制指定明確版本(不是 semver 范圍)「我比較推薦這種寫法」
修改 package.json, 增加resolutions
"resolutions": {"XXXXXXXX": "0.0.1-beta.29"
}
?? 注意:必須是完整版本號,不要寫 ^0.0.1-beta.29
,因為 Yarn 會再次去解析 semver 范圍,從而回到 local.8
。
或者固定下載源?
"resolutions": {"XXXXXXXX": "https://registry.npmjs.org/XXXXXXXX/-/XXXXXXXX-0.0.1-beta.29.tgz"
}
然后執行
rm yarn.lock
yarn install
2.?明確鎖定版本來源(需要使用官方 npm 源)
你可以臨時限制 registry,強制從 registry.npmjs.org
獲取(防止從私有源或本地鏡像拿到污染版本,比如你用的淘寶源):
在 .yarnrc.yml 中制定,yarn 一般用的自己的下載源 (https://registry.yarnpkg.com)因為yarn下載比較快,所以我不建議直接這樣改
npmRegistryServer: "https://registry.npmjs.org"
?然后執行
rm yarn.lock
yarn install
3. 如果還是不是你想要的版本,我們需要排查一下可用版本是否并沒有被發布
yarn npm info XXXXXXXX --fields versions
如果沒有 0.0.1-beta.29
,那你只能:
-
改用別的版本;
-
或讓你團隊發布一個新的版本(例如
0.0.1-beta.30
);
到此,我的問題解決,如果你還有其他問題,歡迎評論區留言提問?