DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

npm 全局安装 EACCES:检查 prefix、权限与 PATH

遇到 /usr/local/lib/node_modules 权限错误,先确认 node/npm、prefix 与失败目录,再采用版本管理器或用户目录并核对 PATH。

在 macOS 或 Linux 上执行 npm 全局安装,报错路径指向 /usr/local/lib/node_modules,并出现 EACCES: permission denied。先确认 npm 要写入哪个目录、这套 Node.js 从哪里来,再选择用户级安装方式。给命令加 sudo 可以改变执行权限,却没有解释为什么你的开发工具需要写入那个目录。

先用失败路径确定问题范围

在报错的那个终端查看下面的信息。这些命令不会安装包或修改权限:

command -v node
command -v npm
node --version
npm --version
npm config get prefix
npm root -g
npm config get cache

command -v 用来确认当前调用的程序,prefix 和 npm root -g 用来确认全局安装位置。不要直接假定每台机器都使用 /usr/local。版本管理器、系统包管理器和单独的安装包可以提供不同路径。

再检查报错中的实际目录,例如:

# 仅当日志确实指向这些目录
ls -ld /usr/local/lib/node_modules /usr/local/bin

-d 查看目录本身的权限,而不是里面某个包的权限。全局包安装可能同时写模块目录和可执行文件目录,因此只改一个目录,后续创建命令链接时仍可能失败。排查时同时确认这两个位置。

如果错误指向项目内的 node_modules 或 ~/.npm 缓存,这已经不是同一个全局目录问题。查清那个路径为什么不可写,以及它是否由以前的管理员操作创建;改变全局 prefix 并不会修复其他目录的所有权。

已使用版本管理器,就先恢复它的路径

如果你已经用 nvm 等工具管理 Node.js,先确认当前 shell 加载了它、选中了项目要求的版本,并且 node、npm 指向同一套安装。不要在版本管理器之外又硬编码一个全局 prefix。

.npmrc 中手动设置 prefix 与 nvm 不兼容。查看已有用户配置时保留原值,再处理冲突。切换版本后,全局工具可能需要在新版本下重新安装;旧版本的全局包不会自动变成新版本的包。

采用 Node 版本管理器重新安装,可以让全局工具跟随选定的 Node 环境。先确定项目依赖的 Node.js 版本,再按所用管理器的安装要求操作,不要照搬其他环境的版本号。

不使用版本管理器时,可设置用户目录

如果你决定保留现有 Node.js 安装,在自己的开发账号下使用全局工具,可以把全局安装目标设置为用户目录。它改变该用户的全局安装目标,不把系统目录改成个人所有。

先记录当前 npm config get prefix 的结果,备份准备编辑的用户配置文件,再设置:

mkdir -p "$HOME/.local"
npm config set prefix "$HOME/.local"

Unix 上,此时全局命令通常位于 ~/.local/bin。把下面这一行放入你的 shell 实际读取的配置文件:

export PATH="$HOME/.local/bin:$PATH"

这是一行 shell 配置,不是 npm 命令。Bash 与 zsh、登录 shell 与交互 shell 的启动文件有区别;macOS 常用 zsh 时,不能假定它会读取 ~/.profile。可按终端启动方式选择 ~/.zprofile 或 ~/.zshrc,不要给多个文件重复追加。重新打开终端后,再看实际 PATH 和程序位置。

这条路径放在 PATH 前面,会让其中的同名命令优先于后面的命令。改变前确认已有工具的来源;如果需要回退,恢复备份中的 prefix 与 PATH 配置。旧目录中的全局包不会随 prefix 自动迁移,也不用为了迁移去删除整套系统 Node.js。

需要全局工具,还是项目依赖

项目编译、测试和运行所需的依赖,通常应保存在项目自己的依赖清单中。随意改成全局安装会让不同机器拿到不同版本,也不能解决项目目录的权限问题。

偶尔运行一个工具时,可以考虑 npm 官方提到的 npx,但它可能下载并执行包,不是权限错误的万能绕行办法。确认包名、版本和用途后再用。长期使用的全局工具则应在选定的 Node.js 环境或用户 prefix 中安装。

不要使用 chmod -R 777,也不要把 /usr、/usr/local 或整个 lib 的所有者递归改成自己的账号。共享主机、系统包管理器维护的文件和个人开发工具有不同的权限边界,不能把一个目录的权限问题扩大成整套系统目录的改动。

安装成功后,检查执行的是哪一份

用原来需要的包重新安装,确认不再报 EACCES,再检查其全局安装位置和实际命令路径。command -v 后跟该包提供的命令名,不一定与 npm 包名相同。

若安装成功却提示命令不存在,先查 ~/.local/bin 或所选版本管理器的 bin 路径是否进入当前 shell 的 PATH。若命令能运行但版本不对,查 PATH 前面是否还有旧安装。最后重新打开终端检查一次,避免只在当前会话临时修改了 PATH,而下次又回到旧环境。