pnpm v11 的 overrides 失效?把 package.json 設定搬到 pnpm-workspace.yaml
升級 pnpm v11 後,如果發現 package.json 裡的 pnpm.overrides 或 pnpm.patchedDependencies 沒有效果,先不要把問題歸因於 lockfile。pnpm 官方文件明確說明:從 v11 開始,pnpm 不再讀取 package.json 的 pnpm field;這些設定要放在 pnpm-workspace.yaml。
直接答案是:把依賴解析與安全修補設定從 package.json 移到 workspace root 的 pnpm-workspace.yaml,再檢查 lockfile、依賴樹和 CI 的 frozen install。packageManager 欄位仍是指定 package manager 的 metadata,不等於 pnpm 設定欄位。
先分清楚哪些設定要搬
舊專案常把 pnpm 設定和套件 metadata 放在同一個 package.json:
{ "pnpm": { "overrides": { "some-package": "1.2.3" }, "patchedDependencies": { } }}pnpm v11 要在 workspace root 的 pnpm-workspace.yaml 宣告:
packages: - "apps/*"
overrides: some-package: "1.2.3"
patchedDependencies:packages 只在 monorepo 需要時保留或調整;單一 root package 也可以沒有這個欄位。overrides 是 root-only 設定,不能放在某個 workspace package 的 package.json 期待只影響自己。patchedDependencies 的欄位則要依 pnpm settings reference 與實際 patch 檔名核對。
安全遷移的五個步驟
1. 先列出目前真正使用的設定
在 workspace root 盤點,不要直接刪掉舊欄位:
rg -n '"pnpm"|overrides|patchedDependencies|allowBuilds|minimumReleaseAge|trustPolicy' \ package.json pnpm-workspace.yaml packages apps 2>/dev/null另外確認是否有 .npmrc、全域 pnpm config 或 CI 指令覆寫設定。官方文件指出,.npmrc 主要讀取 authentication 和 registry settings;其他一般 pnpm 設定應放在 pnpm-workspace.yaml 或全域 config.yaml。
2. 只移動設定,不順便升級依賴
先把 overrides、patchedDependencies 和現有 v11 需要的其他設定逐項移到 workspace root。不要在同一次變更裡加入大量 pnpm update,否則 lockfile 差異會混合「設定位置遷移」與「版本解析變更」。
如果設定中有 registry URL、token 或其他機密,不能直接把 secret 寫進已提交的 pnpm-workspace.yaml。pnpm 文件也提醒,workspace 設定會進版本控制;授權相關內容應留在受信任的 .npmrc 或 CI secret 流程。
3. 重新解析並檢查 lockfile
先在乾淨的本機工作副本執行安裝,觀察 lockfile 是否只反映預期的 override 或 patch:
pnpm installgit diff -- package.json pnpm-workspace.yaml pnpm-lock.yaml不要在還沒看過 diff 前直接用 --frozen-lockfile 當成驗證;它適合在 lockfile 已經正確提交後確認 CI 可重現。若解析結果大幅改變,先停下來檢查 workspace root、pnpm 版本與設定優先順序。
4. 用 pnpm config 和依賴樹驗證
pnpm config 可讀取 project 與 global configuration。不要把包含 registry credential 的完整輸出寫入公共 CI log;只查看非敏感設定,再檢查實際依賴:
pnpm config listpnpm why some-packagepnpm list some-package --depth 10pnpm why 顯示依賴來源,pnpm list 顯示解析結果;兩者都比只看 package.json 的宣告更接近實際安裝狀態。若是安全修補,還要確認 lockfile 內版本真的已避開受影響版本,而不是只看到 override 字串存在。
5. 最後才在 CI 使用 frozen install
當本機的 lockfile、patch 和測試都確認後,CI 才使用:
pnpm install --frozen-lockfilepnpm test把 pnpm major 版本固定在本機與 CI 相同,並讓 workflow 在 lockfile 或 pnpm-workspace.yaml 變更時重新安裝。若這次遷移是為了處理惡意套件或撤版風險,也要把 alert、pnpm why、測試和 token 檢查記錄在同一筆變更中;可參考 Dependabot malware alert 的處理順序。
為什麼會看起來像 overrides 失效?
常見誤判有三個:
- v11 已不讀
package.json.pnpm,但 lockfile 沒重新解析,所以本機仍看到舊結果。 overrides寫在 workspace package 而不是 root,或實際執行指令的目錄不在預期 workspace。- CI 使用另一個 pnpm major、另一份 global config 或舊 lockfile,導致本機與 CI 的解析環境不同。
最近的 pnpm GitHub issue #11536 也反映了開發者在 v11 遷移時遇到的 package.json 設定位置問題;它是問題訊號,不取代官方設定文件。遇到類似情況時,先以目前 pnpm 版本的官方文件和可重現的 lockfile diff 判斷。
常見問題
Q: pnpm v11 還會讀 package.json 的 pnpm 欄位嗎?
A: 不會。pnpm 官方 package.json 文件寫明,v11 起不再讀取該欄位;把設定移到 workspace root 的 pnpm-workspace.yaml,再重新解析和檢查 lockfile。
Q: overrides 可以只放在某個 workspace package 嗎?
A: pnpm 的 overrides 是 root-only 設定。若只希望某個套件使用不同依賴,先確認是否應該改該套件自己的 dependency 宣告,或使用 pnpm 文件提供的其他 dependency resolution 設定,不要把 root override 複製到子套件。
Q: registry token 可以寫進 pnpm-workspace.yaml 嗎?
A: 不應該。workspace 設定會提交到 repository;pnpm 把 authentication 相關設定放在 .npmrc。實際 token 應由受信任的 CI secret 或安全的 registry 設定注入。
參考資料:
pnpm:package.json — v11 settings migration
回報錯字、失效連結,或告訴我你想看的延伸主題。