元数据
| id | npm-global-eacces | 收录 | 2026-08-29 |
|---|---|---|---|
| 问题域 | 编码代理与终端 | 主题分组 | 权限与安全 |
| 适用工具 | npm · 外部工具 | ||
症状
`npm install -g <包>` 报权限错误,两种典型形态:
```
# 形态 1:全局包目录没写权限(最常见)
npm ERR! code EACCES
npm ERR! syscall mkdir
npm ERR! path /usr/local/lib/node_modules/yaml
npm ERR! Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/yaml'
# 形态 2:缓存目录被 root 占用(用 sudo 装过之后)
npm ERR! code EACCES
npm ERR! syscall mkdir
npm ERR! path /home/<user>/.npm/_cacache
npm ERR! Your cache folder contains root-owned files, due to a bug in
npm ERR! previous versions of npm which has since been addressed.
```
特征:错误都带 `npm ERR! code EACCES` + `errno -13`;退出码常为 243;形态 1 发生在**非 root 用户**装全局包(系统 node 装在 `/usr/local` 或 `/usr`,目录属 root);形态 2 常见于**曾经 `sudo npm install`** 之后(`~/.npm` 里混入 root 文件,普通用户再也写不进去)。
原因
npm 全局安装要写两个位置:全局包目录(`npm prefix -g`,如 `/usr/local/lib/node_modules`)和缓存(`~/.npm`)。前者属 root 而当前用户非 root → 形态 1;后者被 root 建过文件/目录(sudo 残留)→ 形态 2。报错虽都是 EACCES,但路径不同、修法不同——先看 `path` 指向哪里。
解法
1. **形态 1:把全局 prefix 改到用户目录(推荐,一劳永逸)**:
```
npm config set prefix ~/.npm-global
export PATH="$HOME/.npm-global/bin:$PATH" # 写入 ~/.bashrc
```
之后 `npm install -g` 装到自己的目录,不再碰系统目录。
2. **形态 1 备选**:用 nvm 管理 node(node 装在自己的 ~/.nvm 下,全局包天然可写);或 `sudo npm install -g`(能用但不推荐,会继续制造形态 2)。
3. **形态 2:把 ~/.npm 所有权还给自己**:
```
sudo chown -R $(whoami) ~/.npm
```
(npm 报错里会直接提示对应的 chown 命令)。不想保留旧缓存也可以 `rm -rf ~/.npm` 让它重建。
4. **验证**:`npm install -g <包>` 成功 + 命令能跑(如 `yaml` 输出 usage)。
验证证据
- 本地实测(2026-08-29,WSL Ubuntu,node v22.22.1 / npm 9.2.0,全局 prefix /usr/local;临时用户 <user>):
- 形态 1 复现:<user> 执行 `npm install -g yaml` → `EACCES: permission denied, mkdir '/usr/local/lib/node_modules/yaml'`(exit 243);
- 形态 1 修复:`npm config set prefix ~/.npm-global` + PATH → 同命令 `added 1 package` 成功,`yaml` 命令可执行(输出 usage);
- 形态 2 复现:把 `/home/<user>/.npm` chown 成 root → 再装 → `EACCES ... /home/<user>/.npm/_cacache`,npm 自提示 `sudo chown -R 1002:1002 "/home/<user>/.npm"`(exit 243);
- 形态 2 修复:`chown -R <user>:<user> /home/<user>/.npm` → `changed 1 package` 成功;
- 临时用户与缓存均已清理(实测环境无残留)。
- 实测复现日志(2026-08-29)
来源与证据
素材来源:https://github.com/vuejs/vue-cli/issues/1809
验证证据:Evidence details kept locally (2026-08-29)