Back

Как исправить ошибку EACCES: Permission Denied в npm

Как исправить ошибку EACCES: Permission Denied в npm

Вы запускаете npm install -g, чтобы установить CLI-инструмент, и вместо успешной установки получаете вот это:

npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules'

Ошибка EACCES в npm — одна из самых частых проблем с правами доступа в Node.js, с которой сталкиваются разработчики на macOS и Linux. Разберёмся, почему она возникает и как правильно её устранить.

Ключевые выводы

  • Ошибка EACCES возникает потому, что npm пытается записать данные в каталог, принадлежащий root, например /usr/local/lib/node_modules, к которому у вашей учётной записи нет доступа.
  • Рекомендуемое решение — установить Node.js через менеджер версий, например nvm, который размещает всё внутри вашего домашнего каталога.
  • В качестве альтернативы можно настроить npm на использование глобального каталога, принадлежащего пользователю, изменив его prefix и обновив PATH.
  • Избегайте sudo npm install -g — это приводит к долгосрочным проблемам с правами доступа и создаёт риски безопасности.
  • Для разового использования CLI-инструмента npx запускает пакеты, не требуя глобальной установки вообще.

Почему возникают ошибки Permission Denied в npm

Когда вы запускаете npm install -g, npm записывает данные в системный каталог, например /usr/local/lib/node_modules. Если вы установили Node.js с помощью официального инсталлятора или системного пакетного менеджера, этот каталог обычно принадлежит пользователю root. У вашей обычной учётной записи нет прав на запись в него, поэтому установка завершается ошибкой.

Это функция безопасности Unix-подобных систем, а не баг. Решение — не обход этих ограничений, а предоставление npm каталога, которым уже владеет ваш пользователь.

Важное уточнение: Эта статья посвящена ошибкам прав доступа при глобальной установке. Если вы видите ошибки прав внутри папки node_modules локального проекта, причина другая — обычно это несоответствие владельца файлов в каталоге проекта.

Как исправить права доступа для глобальной установки npm: два безопасных подхода

Вариант 1: Переустановить Node.js с помощью менеджера версий (рекомендуется)

npm официально рекомендует использовать менеджер версий Node, такой как nvm, чтобы полностью избежать ошибок EACCES. Когда nvm устанавливает Node, он размещает всё внутри вашего домашнего каталога — там, где ваш пользователь является владельцем по умолчанию. Доступ root никогда не потребуется.

Установите nvm:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/HEAD/install.sh | bash

Затем установите Node:

nvm install --lts

После этого npm install -g работает без sudo и изменений прав доступа. Дополнительный плюс: nvm позволяет переключаться между версиями Node для каждого проекта — чего не даёт ни одно другое решение.

Примечание: Если у вас уже настроен пользовательский префикс npm, имейте в виду, что nvm управляет своим префиксом внутренне. Не комбинируйте оба подхода в одной среде — они могут конфликтовать.

Вариант 2: Настроить глобальный каталог npm, принадлежащий пользователю

Если вы не хотите использовать nvm, можно перенаправить место глобальной установки npm в каталог, принадлежащий вашему пользователю. Этот вариант описан в официальной документации npm.

mkdir ~/.npm-global
npm config set prefix '~/.npm-global'

Затем добавьте каталог bin в ваш PATH. Для bash добавьте эту строку в ~/.profile или ~/.bashrc:

export PATH=~/.npm-global/bin:$PATH

Для zsh добавьте ту же строку в ~/.zshrc, затем перезагрузите конфигурацию:

source ~/.zshrc

Проверьте работу, установив пакет без sudo:

npm install -g npm-check-updates

А что насчёт sudo npm install -g?

Избегайте этого. Запуск npm с sudo приводит к тому, что файлы устанавливаются с владельцем root, что создаёт дальнейшие проблемы с правами и реальные риски безопасности — вредоносный или скомпрометированный пакет получит повышенные привилегии. Это краткосрочный обходной путь, который только усугубляет ситуацию.

Быстрая альтернатива: используйте npx

Если CLI-инструмент нужен вам лишь изредка, глобальная установка может вообще не понадобиться. npx запускает пакеты без их глобальной установки, используя локальный пакет или временно загружая нужный:

npm create vite@latest

Никаких прав доступа не требуется, никакой глобальный каталог не задействован.

Какое решение выбрать?

СитуацияЛучший подход
Разработчик, ведущий несколько проектовnvm
Одна машина, переключение версий не требуетсяПользовательский префикс npm
Разовое использование CLI-инструментаnpx

Заключение

Первопричина ошибок EACCES при install -g почти всегда одна и та же: npm пытается записать данные в каталог, принадлежащий root. Устраните это несоответствие в корне — используя nvm или указав npm каталог, которым вы владеете, — и ошибка исчезнет навсегда.

Часто задаваемые вопросы

Можно, но не стоит. Использование sudo устанавливает пакеты с владельцем root, что приводит к дальнейшим проблемам с правами, когда npm позже попытается обновить или удалить их от имени обычного пользователя. Это также подвергает систему рискам безопасности, поскольку любой установочный скрипт выполняется с повышенными привилегиями. Используйте nvm или пользовательский префикс.

Глобальные установки записывают данные в системные каталоги, такие как /usr/local/lib/node_modules, которые в большинстве систем принадлежат root. Локальные установки записываются в папку node_modules внутри каталога вашего проекта, которым вы уже владеете. Именно поэтому npm install работает локально, но без правильной настройки завершается ошибкой при глобальной установке.

Да, пакеты, ранее установленные со старым префиксом, не будут доступны из нового. Их нужно будет переустановить в новом местоположении. Перед сменой префикса просмотрите список старых глобальных пакетов командой npm list -g --depth=0, а затем переустановите их после того, как новый каталог настроен и ваш PATH обновлён.

Как правило, нет. В Windows используется другая модель прав доступа, а путь глобальной установки npm по умолчанию уже находится внутри папки AppData пользователя. Ошибки EACCES встречаются почти исключительно на macOS и Linux, где Unix-подобная модель владения файлами контролирует доступ на запись в системные каталоги, такие как /usr/local.

Gain control over your UX

See how users are using your site as if you were sitting next to them, learn and iterate faster with OpenReplay. — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay