Problem entry · machine-readable · 编码代理与终端

npm install -g 报 npm ERR! code EACCES permission denied(全局安装权限)

本页嵌入 #trove-entity JSON(本条目全量结构化数据);全库数据见 /agent/trove.json。

元数据

idnpm-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)