Watch at Ease看見世界,讀懂生活。

科技 · 實用指南

npm 出現 ETARGET?先證明 registry、版本範圍與已發布版本

「No matching version found」可能來自從未發布的版本、tag 或 range 不符、scope 私有 registry,或鏡像 metadata 過期。先定位缺少的匹配,再清 cache 或刪 lockfile。

套件請求抵達 registry 並分支到可用、標籤與缺少版本的原創示意圖。
原創示意圖:修改依賴前先查詢實際 registry。 Watch at Ease

npm 回報 ETARGET 或「No matching version found」時,先保留完整套件規格,並在 npm 真正使用的 registry 驗證。關鍵證據是請求者、registry endpoint、已發布版本集合與 dist-tag 對應,而不是刪除 cache 或 lockfile 後結果是否改變。

記錄精確規格與請求者

修改檔案前先複製完整 ETARGET 行。記錄套件名稱、精確版本、range 或 tag、npm 版本,以及請求來自 package.json、package-lock.json、workspace、產生器範本或傳遞依賴。在兩個清單搜尋完整套件名;若是傳遞依賴,用安裝 log 與依賴樹找出父請求者。

查詢 npm 實際使用的同一 registry

先執行 npm config get registry,再檢查專案、使用者與 CI npmrc 的 scope registry,但不要輸出 token。針對同一 endpoint 執行 npm view <package> versions --json 與 npm view <package> dist-tags --json。npmjs.com 看得到的版本不代表私有 registry 或 mirror 已提供。

區分精確版本、range 與 tag

4.2.1 這種精確要求必須真的發布;^4.2.1 這種 range 必須匹配 registry 回傳的至少一個版本;latest、beta、next 是可獨立移動的 dist-tag。同時比對 versions 與 dist-tags,不要把 Git tag、Node.js 版本或 GitHub release 當成 npm 套件版本。

檢查預發布與發布邊界

SemVer 中 3.0.0-beta.9 的優先序低於 3.0.0,兩個識別碼不能互換。如果 registry 只有預發布版,精確要求 3.0.0 仍沒有匹配。更改 range 前查看發布時間與 dist-tag,並保留失敗規格,確認版本是未發布、已撤回或暫時不可用。

分開稽核 manifest、lockfile 與 mirror

若同一 registry 的 npm view 看得到版本,就比較失敗的 CI 或 IDE 環境;registry、scope 對應、proxy 與 credentials 可能不同。接著在 package.json 和 package-lock.json 定位要求並判斷直接或傳遞來源。私有 proxy 應走管理員支援的 metadata refresh,不先刪 lockfile 或強制清 cache。

只修復已證明的錯配

版本從未存在時,依相容性修正範本或依賴並測試;dist-tag 指向意外版本時,使用已驗證版本或等待發布者;mirror 過期時刷新 mirror;只有 CI 不同時對齊 scope registry 且不洩漏 credentials。最後再次 npm view、安裝並審查 lockfile diff。

比對 manifest、lockfile 與新舊 registry metadata 的原創示意圖。
原創示意圖:分開驗證要求 spec、version 集合與 registry endpoint。 Watch at Ease