1476 字
7 分鐘

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/uipackages/* 不會自動匹配它;要依實際結構加入 packages/** 或更窄的路徑。反過來,過寬的 glob 也可能把測試資料夾或不應加入的 package 納進來,所以不要只靠加 ** 讓錯誤消失。

pnpm 官方設定文件也指出,如果省略 packages 欄位,workspace 只包含 root package。先確認你是在包含這份 YAML 的目錄執行安裝,不要在子資料夾把另一個 package.json 當成 workspace root。

用唯讀檢查依序定位#

從包含 pnpm-workspace.yaml 的根目錄執行:

Terminal window
pwd
sed -n '1,160p' pnpm-workspace.yaml
node -p "require('./packages/ui/package.json').name"
node -p "require('./apps/web/package.json').dependencies['@acme/ui']"

packages/uiapps/web@acme/ui 換成錯誤訊息中的實際路徑與名稱。這四個檢查分別回答:目前位置是不是 root、glob 寫了什麼、被引用 package 的 name 是什麼,以及 consumer 要求什麼版本。

接著可用 filter 確認 pnpm 是否已看見該 package:

Terminal window
pnpm --filter '@acme/ui' exec pwd
pnpm --filter '@acme/ui' list --depth 0

若 filter 也找不到,先修 root、glob 或 name;如果 filter 找得到但 install 仍失敗,再檢查 dependency range、lockfile 與是否在另一個目錄執行指令。

四種常見原因與精確修法#

pnpm-workspace.yaml 不在真正的根目錄#

把它放在和 root package.jsonpnpm-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 重新安裝:

Terminal window
pnpm install
pnpm --filter '@acme/ui' run build
pnpm --filter '@acme/web' run build
git 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.jsonpnpm-lock.yaml 同層。它的 packages patterns 定義哪些 app 與 package 屬於同一個 workspace。

Q: 所有 package 都應該用遞迴 glob 嗎?#

A: 不需要。先用能精確涵蓋既有結構的最窄 pattern;只有在 repository 確實有多層 package 時才加遞迴 pattern,並檢查排除規則與新增的 workspace 範圍。

參考資料:

pnpm Docs:Workspace

pnpm Docs:Settings (pnpm-workspace.yaml)

pnpm GitHub Issue:ERR_PNPM_WORKSPACE_PKG_NOT_FOUND

ERR_PNPM_WORKSPACE_PKG_NOT_FOUND 怎麼修?先對齊套件名稱與 workspace glob
https://laplusda.com/posts/pnpm-workspace-pkg-not-found/
作者
Zero
發佈於
2026-08-17
許可協議
CC BY-NC-SA 4.0
這篇文章有幫助嗎?

回報錯字、失效連結,或告訴我你想看的延伸主題。