科技 · 實用指南
npm 出現 EACCES 權限拒絕?先讀失敗路徑,再考慮 sudo、chown 或前綴修改
快取、專案、全域前綴與容器錯誤外觀相同,卻屬於不同擁有者。任何修改前先保留準確路徑並判定範圍。

EACCES 只表示某次檔案系統操作遭拒,並不代表 npm、快取、目前專案或全域安裝前綴全部故障。
關鍵線索是準確的 `npm ERR! path`、syscall 與執行命令的帳號。修改擁有權、權限、快取、前綴或使用者前,先保存這三項。
本指南將故障分為使用者快取、本機專案、全域前綴、容器或 CI 掛載四類,並提供唯讀證據卡與下一步負責者。
一個錯誤碼涵蓋四種權限範圍
`~/.npm` 下的路徑是使用者快取;目前專案內的 `node_modules` 是專案樹;位於 `npm config get prefix` 結果下的路徑通常屬於全域安裝;`/workspace`、`/app`、掛載卷或異常 HOME 則可能是容器、CI、遠端工作區或服務帳號不符。
四個分支需要不同擁有者與處理方式。改全域前綴不會讓 `/var/test/node_modules` 可寫;遞迴修改快取也無法修復唯讀掛載;用 sudo 重跑還可能產生新的 root 擁有檔案。
修改前先保存唯讀證據卡
複製完整 EACCES 區塊,保存 code、syscall、path、cwd、Node/npm 版本與原命令。再記錄 `npm config get cache`、`npm config get prefix`、`npm prefix`、`npm root -g`、目前帳號與工作目錄。
macOS/Linux 用 `ls -ld` 或 `namei -l` 檢查路徑與父目錄;容器還需記錄 UID/GID、HOME 與掛載。Windows 用 `Get-Acl`。不要在工單貼 registry token 或 `.npmrc` 內容。
路徑位於 npm 快取時,先核實擁有權與環境
若路徑在快取目錄下,專案本身可能可寫。比對快取與父目錄的擁有者、目前 UID,以及先前 sudo 或容器是否寫入同一 HOME。`npm cache verify` 是完整性檢查,清空快取不是權限診斷。
不要盲目執行 npm 顯示的 chown 命令。Termux 案例證明提示可能不符合真實環境;只有確認擁有權錯誤後,才由 HOME 擁有者審核小範圍修復。
路徑位於專案時,修復專案邊界
若失敗在 `/var/test/node_modules`、儲存庫或掛載工作區,表示目前帳號不能寫入本機安裝位置。改前綴不會改變該目錄。請識別專案擁有者、群組、ACL、掛載模式與建立者。
不要無審核使用 `chmod -R 777`、`chmod a+w` 或共享樹遞迴 chown。應恢復預期帳號/群組,或以工作區真實擁有者執行建置。
路徑位於全域前綴時,採用 npm 支援方案
npm 官方建議使用 Node 版本管理器,或將 npm prefix 改到使用者自有目錄;偶爾執行命令可考慮 `npx`。
先確認路徑確實位於全域前綴。受管設備的系統 Node 目錄可能由管理員控制,應申請核准的執行環境。
容器與 CI 必須對齊 UID、HOME 與掛載
容器中數值 UID/GID 比名稱可靠。主機掛載可能屬於不同 UID,HOME 可能是唯讀或共享快取,先前 root 步驟也可能污染多個位置。
持久修復通常是對齊 UID、分離快取或調整掛載。未經卷擁有者核准,不要從臨時容器遞迴 chown 主機卷。
選擇最小的經審核動作
交接應列出失敗路徑、syscall、帳號、快取、前綴、專案擁有者與環境類型,並標明四個分支之一。
路徑超出預期、共享擁有權不一致、掛載唯讀、環境受管、帳號未知或動作會擴大權限時應停止。真正解決是預期帳號完成預期操作。
