ERR_PNPM_WORKSPACE_PKG_NOT_FOUND 怎麼修?先對齊套件名稱與 workspace glob
ERR_PNPM_WORKSPACE_PKG_NOT_FOUND 的意思是:某個 dependency 要求本機 workspace package,但 pnpm 找不到符合條件的套件。資料夾存在、裡面也有 package.json,仍可能因為 workspace glob 沒包含它,或 manifest 的 name 和 dependency key 不一致而失敗。
修復順序應該固定成:先確認套件名稱,再確認 pnpm-workspace.yaml 的範圍,最後檢查 workspace: protocol 與執行根目錄。不要先把 workspace:* 改成普通版本,讓 registry 套件暫時蓋住 monorepo 的設定錯誤。
先讀懂錯誤裡的套件身份
假設應用程式宣告:
{ "dependencies": { "@acme/ui": "workspace:*" }}pnpm 要找到的不是資料夾名稱,而是某個 workspace package manifest 中完全相同的名稱:
{ "name": "@acme/ui", "version": "1.0.0"}packages/ui 是路徑,@acme/ui 是 package identity,兩者可以有關聯但不是同一個欄位。scope、大小寫、拼字或連字號只要有一處不同,都可能造成找不到。
workspace: protocol 的價值正在於它會拒絕從 registry 找替代品。pnpm 官方文件說明,當使用 workspace: 時,只有本機 workspace package 能滿足依賴;所以它報錯雖然直接,卻能避免 CI 不小心安裝另一個版本。
確認 workspace root 與 package glob
pnpm workspace 的 root 必須有 pnpm-workspace.yaml。例如:
.├── package.json├── pnpm-lock.yaml├── pnpm-workspace.yaml├── apps/│ └── web/│ └── package.json└── packages/ └── ui/ └── package.json對應設定可以是:
packages: - 'apps/*' - 'packages/*'如果套件更深一層,例如 packages/design/ui,packages/* 不會自動匹配它;要依實際結構加入 packages/** 或更窄的路徑。反過來,過寬的 glob 也可能把測試資料夾或不應加入的 package 納進來,所以不要只靠加 ** 讓錯誤消失。
pnpm 官方設定文件也指出,如果省略 packages 欄位,workspace 只包含 root package。先確認你是在包含這份 YAML 的目錄執行安裝,不要在子資料夾把另一個 package.json 當成 workspace root。
用唯讀檢查依序定位
從包含 pnpm-workspace.yaml 的根目錄執行:
pwdsed -n '1,160p' pnpm-workspace.yamlnode -p "require('./packages/ui/package.json').name"node -p "require('./apps/web/package.json').dependencies['@acme/ui']"把 packages/ui、apps/web 和 @acme/ui 換成錯誤訊息中的實際路徑與名稱。這四個檢查分別回答:目前位置是不是 root、glob 寫了什麼、被引用 package 的 name 是什麼,以及 consumer 要求什麼版本。
接著可用 filter 確認 pnpm 是否已看見該 package:
pnpm --filter '@acme/ui' exec pwdpnpm --filter '@acme/ui' list --depth 0若 filter 也找不到,先修 root、glob 或 name;如果 filter 找得到但 install 仍失敗,再檢查 dependency range、lockfile 與是否在另一個目錄執行指令。
四種常見原因與精確修法
pnpm-workspace.yaml 不在真正的根目錄
把它放在和 root package.json、pnpm-lock.yaml 同層的 workspace root。不要只放在 packages/ 裡,否則上層的 app 不會使用你以為的 workspace 定義。
glob 沒有包含套件
將設定改成真的匹配路徑,例如:
packages: - 'apps/*' - 'packages/*' - 'packages/design/**'修改後先檢查 packages/design/** 是否也誤收 test、fixture 或範例目錄;workspace package 變多會改變安裝、script 與 lockfile 的範圍。
folder 名稱和 package name 不一致
consumer 的 dependency key 必須和被引用 package 的 name 完全一致:
{ "name": "@acme/design-system"}不要只把資料夾改名,也不要只改 dependency key。兩邊一起修改後,再從 root 執行正常的 pnpm install,讓 lockfile 反映新的 workspace identity。
這個依賴其實不是 workspace package
如果它是另一個 repository 或刻意要使用 registry 版本,就不要硬套 workspace:*。改用正式版本、支援的 Git dependency 或其他明確來源;如果仍是 Git dependency 的 CI SSH 問題,可另外參考 pnpm Git dependency 在 CI 的 publickey 排查。
不要先做這些看似有效的修復
- 不要只把
workspace:*換成*,這可能讓 install 下載錯誤版本。 - 不要為了通過一次 CI 就加入沒有邊界的
**glob。 - 不要把 lockfile 刪掉當成第一個動作;它不會把未被 workspace 發現的 package 變出來。
- 不要從 nested directory 執行修復後,假設 CI 會找到同一個 root。
- 不要把 npm Workspaces 的
workspaces欄位和 pnpm 的pnpm-workspace.yaml混用;兩者的 lockfile、依賴 protocol 與設定位置不同。
如果你正在做 npm 與 pnpm 的 monorepo 選擇,可以搭配 npm Workspaces 整理 Vue 3 多專案 查看兩套工具的界線;本文則只處理 pnpm 已經報出 workspace package 找不到的情況。
修好後再做一次乾淨安裝驗證
當 identity、glob 和 protocol 都一致後,再從 workspace root 重新安裝:
pnpm installpnpm --filter '@acme/ui' run buildpnpm --filter '@acme/web' run buildgit diff -- package.json pnpm-workspace.yaml pnpm-lock.yaml實際 filter 名稱依 repository 的 name 為準。若只改了 package name 或 glob,diff 應該能清楚說明 workspace 範圍與 lockfile 為何改變;如果出現大量無關版本更新,先停下來確認 pnpm 版本與 registry 設定,不要把噪音一起提交。
這個錯誤的核心不是「pnpm 不會讀資料夾」,而是三個邊界沒有說同一件事:manifest 的 package identity、workspace 的 discovery glob,以及 dependency 的 local-only protocol。讓它們一致,通常不需要特殊 install flag。
常見問題
Q: 為什麼資料夾明明存在,pnpm 還是說 package 找不到?
A: pnpm 依 package manifest 的 name 和 workspace membership 解析,而不是只看資料夾。資料夾可能被 glob 排除,或 name 和 consumer dependency key 不同;先分開檢查這兩件事。
Q: workspace:* 找不到時會改從 npm registry 安裝嗎?
A: 不會。pnpm 官方 workspace protocol 的設計就是只接受本機 workspace package;找不到時直接失敗。若你想使用 registry 版本,應明確改用版本範圍,而不是把 workspace 錯誤隱藏起來。
Q: pnpm-workspace.yaml 應該放在哪裡?
A: 放在 workspace root,通常和 root package.json、pnpm-lock.yaml 同層。它的 packages patterns 定義哪些 app 與 package 屬於同一個 workspace。
Q: 所有 package 都應該用遞迴 glob 嗎?
A: 不需要。先用能精確涵蓋既有結構的最窄 pattern;只有在 repository 確實有多層 package 時才加遞迴 pattern,並檢查排除規則與新增的 workspace 範圍。
參考資料:
回報錯字、失效連結,或告訴我你想看的延伸主題。