pnpm ERR_PNPM_TARBALL_INTEGRITY 怎麼修?先驗證 lockfile 再更新 checksum
ERR_PNPM_TARBALL_INTEGRITY 表示下載到的 package tarball,和 pnpm-lock.yaml 內記錄的 integrity hash 對不上。這不一定是 node_modules 壞掉;也可能是 registry、proxy、cache、lockfile 或套件來源真的發生變化。
pnpm 10.34.0 和 11.4.0 在 2026 年 5 月 27 日把 tarball integrity mismatch 改成預設直接失敗。這個改變的目的,是避免一般的 pnpm install 默默重新解析 registry 並覆寫已提交的 integrity。排查時最重要的順序是:先確認版本與來源,再決定是否有充分理由更新 checksum。
先分清楚是哪一種 integrity 錯誤
| 錯誤 | 代表的狀況 | 第一個動作 |
|---|---|---|
ERR_PNPM_TARBALL_INTEGRITY | lockfile 有 integrity,但下載內容的 hash 不一致 | 查 registry、proxy、cache 和套件是否被重新發布 |
ERR_PNPM_MISSING_TARBALL_INTEGRITY | lockfile 的 remote tarball 缺少 integrity | 先檢查 lockfile 變更來源,不要直接補 hash |
| 安裝成功但 lockfile 改變 | 可能使用較舊 pnpm 或未鎖定 install 行為 | 固定 package manager 版本並比較 diff |
官方 release notes 也列出例外:git-hosted tarball 和 file: tarball 不走同一套 remote registry integrity 判斷;前者由 commit SHA 錨定,後者由本機路徑控制。不要把所有 tarball 錯誤都套用同一個修法。
第一步:記錄版本與實際來源
先在出錯的專案根目錄保存環境資訊,不要急著刪 lockfile:
pnpm --versionnode --versionpnpm config get registrygit status --short接著確認 package.json 的 packageManager、CI 使用的 pnpm major version,以及本機和 CI 是否指向同一個 registry。pnpm 10.34 和 11.4 的行為不能直接推論到所有舊版本;如果團隊還在使用 pnpm 9 或更早版本,先把版本差異記錄下來,再決定要升級或只做重現。
第二步:定位 lockfile 中的套件
把錯誤訊息中的套件名稱代入搜尋,不要一開始就重建整份 lockfile:
rg -n \ '套件名稱|integrity:' \ pnpm-lock.yaml要看的不是只有那一行 hash,而是同一個 package 的:
- version 和 resolution URL 是否如預期。
- lockfile 是否在最近的 PR 中被手動修改。
- registry URL 是否從 public registry 變成 mirror 或 private registry。
- 同一套件是否有多個 peer dependency snapshot,導致你查錯位置。
若錯誤只在 CI 發生,將 CI 的 pnpm 版本、registry、proxy 設定和 cache key 與本機逐項對照。不要把「本機可以裝」直接當成 lockfile 正確,因為兩邊可能下載到不同來源。
第三步:只有確認來源可信,才用 --update-checksums
pnpm 官方提供的明確 opt-in 是:
pnpm install --update-checksums它的用途是依目前 registry 提供的內容刷新 lockfile integrity。這個指令不是「修復任何安裝錯誤」的通用捷徑;執行前至少要確認:
- registry 是團隊預期的官方或受信任 mirror。
- proxy 或 cache 沒有把另一個檔案誤當成該套件。
- 套件版本、resolution URL 和 lockfile 變更來自可審核的來源。
- 更新後的
pnpm-lock.yamldiff 只包含預期套件。
執行後立即檢查:
git diff -- pnpm-lock.yamlpnpm install --frozen-lockfile如果 hash 改了,但你找不到 registry 或套件內容為什麼改變,先停止,不要把新 hash 當成證據。重新計算 checksum 只能讓目前下載到的 bytes 通過檢查,不能證明它就是團隊原本想要的套件。
哪些指令不會繞過 integrity 保護
pnpm 10.34/11.4 的 release notes 特別說明,下面幾個行為不能取代完整性驗證:
pnpm install --force不會自動覆寫 mismatch。pnpm update不會把鎖定的 integrity 當成可靜默改寫的值。pnpm install --fix-lockfile的用途是補齊 lockfile 結構,不是繞過 hash。pnpm install --frozen-lockfile仍維持原本的 frozen 行為。
這些差異很實用:如果你看到有人在 CI 失敗時直接加 --force,那不等於完成了 supply-chain 排查。先判斷套件版本是否應該更新;若是 registry 內容非預期改變,應保留證據並向 registry 或套件維護者確認。
什麼情況應該更新套件,而不是更新 checksum
若套件版本被重新發布、mirror 同步了不同內容,或原本的 resolution URL 已不再是團隊信任的來源,優先選擇升到一個新的、可驗證的版本,再提交 package manifest 和 lockfile。不要在沒有解釋的情況下把舊版本重新 hash。
若 lockfile 缺少 integrity,先查它是由哪個 pnpm 版本、哪個 pruner、哪個自動化工具產生。pnpm 11.4 對 remote tarball 缺少 integrity 會 fail closed;直接補值可能掩蓋有人修改 lockfile 的事實。
CI 中的安全落地方式
建議在 CI 固定三件事:
- 使用 repository 宣告的 pnpm 版本,而不是 runner 預裝的 latest。
- 以
pnpm install --frozen-lockfile進行安裝,讓 lockfile mismatch 直接暴露。 - 把
pnpm-lock.yaml的變更放進 PR review,不允許安裝步驟在背景中默默改檔。
如果 CI 使用 private registry 或 mirror,把 registry host、認證範圍和 cache 命中策略一起寫入部署文件。完整性 hash 是檔案內容的檢查點,不是 registry 身份、credentials 或 build script 安全性的替代品。
ZeroOne 既有的 pnpm Git dependency 在 CI 出現 publickey 錯誤時的排查處理的是 Git transport 和 SSH 權限;如果錯誤指向 tarball integrity,應改用本篇的 registry/lockfile 路徑。若你正在從 pnpm 10 遷移到 11,也可以先看 pnpm v11 package.json settings 遷移檢查,把版本升級和 integrity 變更分開驗證。
常見問題
Q: pnpm install --force 可以修好 ERR_PNPM_TARBALL_INTEGRITY 嗎?
A: 不應把它當成修法。pnpm 10.34 和 11.4 的官方說明指出,--force 不會繞過 integrity check。先確認 registry、proxy、cache 和 lockfile 內容;只有在來源可信且確定要刷新目前 hash 時,才使用 --update-checksums。
Q: --update-checksums 會自動證明套件安全嗎?
A: 不會。它只會把目前 registry 提供的 tarball integrity 寫回 lockfile。執行前仍要確認來源、版本和下載內容,執行後要審查 lockfile diff;若套件被非預期重新發布,應先處理供應鏈問題。
Q: 為什麼 CI 失敗、本機卻成功?
A: 常見差異包括 pnpm major version、registry/mirror、proxy、cache 或 lockfile 是否相同。先保存 pnpm --version、registry 和 lockfile 狀態,再用同一版本與 --frozen-lockfile 重現,不要只刪除 node_modules。
參考資料:
回報錯字、失效連結,或告訴我你想看的延伸主題。