npm выдает ошибку без sudo

Я только что установил node и npm через пакет на nodejs.org, и всякий раз, когда я пытаюсь найти или установить что-то с помощью npm, выдается следующее сообщение об ошибке, если только я не ввожу команду. У меня есть ощущение, что это проблема с разрешениями? Я уже админ.

npm ERR! Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json'
npm ERR!  { [Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json']
npm ERR!   errno: 3,
npm ERR!   code: 'EACCES',
npm ERR!   path: '/Users/chietala/.npm/-/all/.cache.json' }
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.

npm ERR! System Darwin 12.2.0
npm ERR! command "node" "/usr/local/bin/npm" "search" "bower"
npm ERR! cwd /Users/chietala
npm ERR! node -v v0.10.4
npm ERR! npm -v 1.2.18
npm ERR! path /Users/chietala/.npm/-/all/.cache.json
npm ERR! code EACCES
npm ERR! errno 3
npm ERR! stack Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json'
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /Users/chietala/npm-debug.log
npm ERR! not ok code 0

45 ответов

Решение

Это похоже на проблему с разрешениями в вашем домашнем каталоге. Чтобы восстановить право собственности на каталог .npm, выполните:

sudo chown -R $(whoami) ~/.npm

Разрешения, которые вы использовали при установке Node, будут необходимы при выполнении таких вещей, как запись в вашем каталоге npm (npm link, npm install -g, так далее.).

Вероятно, вы запустили установку узла с правами root, поэтому при глобальной установке пакетов вам нужно быть пользователем root.


Решение 1: NVM

Не взламывайте разрешения, установите правильный путь.

На компьютере разработчика не следует устанавливать и запускать узел с правами root, в противном случае такие вещи, как npm link, npm install -g понадобятся те же разрешения.

NVM (Node Version Manager) позволяет устанавливать Node без прав root, а также позволяет устанавливать множество версий Node, чтобы легко с ними играть. Идеально подходит для разработки.

  1. Удалите Node (вероятно, потребуется разрешение root). Это может помочь вам.
  2. Затем установите NVM, следуя инструкциям на этой странице.
  3. Установить узел через NVM: nvm install node

Сейчас npm link, npm install -g больше не будет требовать, чтобы вы были пользователем root.

Изменить: см. Также https://docs.npmjs.com/getting-started/fixing-npm-permissions


Решение 2. Установите пакеты глобально для данного пользователя

Не взламывайте разрешения, устанавливайте пакеты npm по всему миру правильным способом.

Если вы используете OSX или Linux, вы можете создать пользовательский каталог для вашего глобального пакета и установки npm а также node знать, как найти глобально установленные пакеты.

Посмотрите эту замечательную статью для пошаговых инструкций по глобальной установке модулей npm без sudo.

См. Также документацию npm об исправлении разрешений npm.

Также вам понадобится разрешение на запись в node_modules каталог:

sudo chown -R $USER /usr/local/lib/node_modules

Смена владельца "системных глобальных" папок - это взлом. При новой установке я бы сконфигурировал NPM для использования уже доступного для записи местоположения для "пользовательских глобальных" программ:

npm config set prefix ~/npm

Затем убедитесь, что вы добавили эту папку в свой путь:

export PATH="$PATH:$HOME/npm/bin"

См. ErikAndreas на модули NPM, которые не будут устанавливаться глобально без sudo и более подробного пошагового руководства от @sindresorhus с наборами $MANPATH,

Осторожно!!! Осторожно!!! Осторожно!!!

chown или chmod НЕ являются решением проблемы безопасности.

Вместо этого сделайте:

Сначала проверьте, куда указывает npm, если вы звоните:

npm config get prefix

Если /usr возвращается, вы можете сделать следующее:

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

Это создаст npm-Direktory в вашем домашнем каталоге и укажет на него npm.

Чтобы эти изменения были постоянными, вы должны добавить команду экспорта в ваш.bashrc:

echo -e "export NPM_CONFIG_PREFIX=~/.npm-global\nexport PATH=$PATH:~/.npm-global/bin" >> ~/.bashrc

Я столкнулся с этим при установке Recess ( https://github.com/twitter/recess), чтобы скомпилировать мой CSS для Bootstrap 3.

При установке углубления:

-npm install recess -g
  1. Вам нужно разблокировать разрешения в вашем home каталог, как Noah говорит:

    sudo chown -R `whoami` ~/.npm
    
  2. Вам также необходимо разрешение на запись в node_modules каталог, как говорит Xilo, так что если он все еще не работает, попробуйте:

    sudo chown -R `whoami` /usr/local/lib/node_modules
    
  3. Если вы все еще видите ошибки, вам также может потребоваться исправить /usr/local разрешения:

    sudo chown -R `whoami` /usr/local
    

Обратите внимание, что, как указано в этом сообщении /usr/local/ на самом деле вы не системный каталог, если вы работаете на Mac, поэтому этот ответ на самом деле совершенно "безопасен" для пользователей Mac. Однако, если вы работаете в Linux, см. Ответ Christopher Will ниже для многопользовательского, системно-безопасного решения (но более сложного).

Другие ответы предлагают изменить владельца или разрешения системных каталогов для конкретного пользователя. Я очень не одобряю этого, это может стать очень неловким и может испортить всю систему!

Вот более общий и безопасный подход, который также поддерживает многопользовательский режим.

Создайте новую группу для пользователей-узлов и добавьте в нее нужных пользователей. Затем установите принадлежность узловых файлов / каталогов к этой группе.

# Create new group
sudo groupadd nodegrp 

# Add user to group (logname is a variable and gets replaced by the currently logged in user)
sudo usermod -a -G nodegrp `logname`

# Instant access to group without re-login
newgrp nodegrp

# Check group - nodegrp should be listed as well now
groups

# Change group of node_modules, node, npm to new group 
sudo chgrp -R nodegrp /usr/lib/node_modules/
sudo chgrp nodegrp /usr/bin/node
sudo chgrp nodegrp /usr/bin/npm

# (You may want to change a couple of more files (like grunt etc) in your /usr/bin/ directory.)

Теперь вы можете легко установить свои модули как пользователь

npm install -g generator-angular

Некоторые модули (grunt, bower, yo и т. Д.) По-прежнему должны быть установлены от имени пользователя root. Это потому, что они создают символические ссылки в /user/bin/.

редактировать

Через 3 года я бы порекомендовал использовать Node Version Manager. Это сэкономит вам много времени и хлопот.

The official documentation on how to fix npm install permissions with an EACCES error is located at https://docs.npmjs.com/getting-started/fixing-npm-permissions.

I encountered this problem after a fresh install of node using the .pkg installer on OSX. There are some great answers here, but I didn't see a link to npmjs.com yet.

Вариант 1. Измените разрешение на каталог по умолчанию для npm.

  1. Найдите путь к каталогу npm:

    npm config get prefix
    

Для многих систем это будет / usr / local.

ВНИМАНИЕ: Если отображаемый путь - просто / usr, переключитесь на Вариант 2.

  1. Измените владельца каталогов npm на имя текущего пользователя (ваше имя пользователя!):

    sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
    

    Это изменяет права доступа к подпапкам, используемым npm и некоторыми другими инструментами (lib / node_modules, bin и share).

Вариант 2: Изменить каталог по умолчанию для npm на другой каталог

Временами вы не хотите менять владельца каталога по умолчанию, который использует npm (то есть / usr), так как это может вызвать некоторые проблемы, например, если вы используете систему совместно с другими пользователями.

Вместо этого вы можете настроить npm для использования другого каталога. В нашем случае это будет скрытый каталог в нашей домашней папке.

  1. Создайте каталог для глобальных установок:

    mkdir ~/.npm-global
    
  2. Настройте npm для использования нового пути к каталогу:

    npm config set prefix '~/.npm-global'
    
  3. Откройте или создайте файл ~/.profile и добавьте следующую строку:

    export PATH=~/.npm-global/bin:$PATH
    
  4. Вернитесь в командную строку и обновите системные переменные:

    source ~/.profile
    

Я столкнулся с этой проблемой, и хотя это правда, что ~/.npm должен принадлежать вашему пользователю, npm там модули не устанавливались.

Что на самом деле решило мою проблему, так это эта команда:

npm config set prefix ~/.npm

Он гарантирует, что вся ваша глобальная установка будет проходить под этим префиксом. И важно, чтобы этот каталог принадлежал вашему пользователю.

TL;DR

всегда использовать sudo -i или же sudo -H при беге npm install установить глобальные пакеты.

-

Когда вы используете npm он загружает пакеты в ваш домашний каталог пользователя. Когда ты бежишь как sudo, npm устанавливает файлы в тот же каталог, но теперь они принадлежат пользователю root.

Это то, что происходит абсолютно с каждым человеком, который когда-либо использовал npm:

  • установить некоторые локальные пакеты без проблем, используя npm install foo
  • установить глобальный пакет, используя sudo install -g foo-cli без проблем
  • попытаться установить локальный пакет с npm install bar
  • разочароваться в npm дизайнеры теперь, когда вам нужно идти chmod каталог снова

Когда вы используете -i или же -H вариант с sudo, ваш домашний каталог будет rootдомашний каталог. Любые глобальные установки будут кэшировать пакеты в /root/.npm вместо rootфайлы в /home/me/.npm,

Просто всегда использую sudo -i или же sudo -H при беге npm install установить глобальные пакеты и ваши npm проблемы с разрешениями исчезнут.

Для блага.

http://hood.ie/blog/why-you-shouldnt-use-sudo-with-npm.html

-QV принятый ответ для исправления уже трахал npm,

Как будто нам нужно больше ответов здесь, но в любом случае..

У Синдре Соруса есть руководство Установка глобальных пакетов npm без sudo на OS X и Linux, в которой рассказывается, как правильно установить, не мешая с разрешениями:

Вот способ установить пакеты глобально для данного пользователя.

  1. Создайте каталог для ваших глобальных пакетов

    mkdir "${HOME}/.npm-packages"
    
  2. Ссылка на этот каталог для будущего использования в вашем.bashrc/.zshrc:

    NPM_PACKAGES="${HOME}/.npm-packages"
    
  3. Укажите npm, где хранить ваш глобально установленный пакет. В вашем $HOME/.npmrc добавление файла:

    prefix=${HOME}/.npm-packages
    
  4. Убедитесь, что узел найдет их. Добавьте следующее в ваш.bashrc/.zshrc:

    NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"
    
  5. Убедитесь, что вы найдете установленные двоичные файлы и справочные страницы. Добавьте следующее к вашему .bashrc/.zshrc:

    PATH="$NPM_PACKAGES/bin:$PATH"
    # Unset manpath so we can inherit from /etc/manpath via the `manpath`
    # command
    unset MANPATH # delete if you already modified MANPATH elsewhere in your config
    MANPATH="$NPM_PACKAGES/share/man:$(manpath)"
    

Проверьте npm-g_nosudo для выполнения вышеупомянутых шагов автоматически

Проверьте источник этого руководства для последних обновлений.

Когда вы запускаете npm install -g somepackage, вы можете получить ошибку EACCES, требующую повторного запуска команды от имени пользователя root / Administrator. Это проблема с разрешениями.

Это легко исправить, откройте свой терминал (Приложения> Утилиты> Терминал)

sudo chown -R $USER /usr/local/lib/node_modules

** Я настоятельно рекомендую вам не использовать управление пакетами с помощью sudo (sudo npm -g установить что-то), потому что некоторые проблемы могут возникнуть позже **

Ссылка: http://foohack.com/2010/08/intro-to-npm/

Для Mac (взято из ответа Кристопера Уилла)

Mac OS X 10.9.4

  1. Системные настройки> Пользователи и группы> (разблокировать) > нажмите +:

    Новая учетная запись> "Группа"
    Имя учетной записи: nodegrp

    После создания группы отметьте пользователя, который будет включен в эту группу.

  2. sudo chgrp -R nodegrp / usr / local / lib / node_modules /
    sudo chgrp nodegrp / usr / bin / node
    sudo chgrp nodegrp / usr / bin / npm
    sudo chown -R $ (whoami): nodegrp ~ /.npm

Для меня, выполнить только

sudo chown -R $(whoami) ~/.npm

не работает Затем я выполняю тоже

sudo chown -R $(whoami) /usr/lib/node_modules/
sudo chown -R $(whoami) /usr/bin/node
sudo chown -R $(whoami) /usr/bin/npm

И все работает отлично!

У меня была похожая проблема: модули NPM не будут устанавливаться глобально без sudo, проблема была в том, что когда я установил узел, я сделал это с помощью sudo через chris / lea ppa repo.

Моим решением было удалить узел, а затем установить его следующим образом:

Загрузите последние стабильные исходные узлы с сайта nodejs.org # в моем случае node-v0.10.20.tar.gz

tar -zxf node-v0.10.20.tar.gz # uncompress sources

cd node-v0.10.20 #enter несжатая папка

sudo chown $ USER -R / usr / local

./configure --prefix = / usr / local && make && make install

PD: Если вы не хотите менять владельца папки / usr / local, вы можете установить ее там, где у вас уже есть. Проблема этого подхода заключается в том, что вам придется связать папку установки с командной строкой bash, чтобы мы могли использовать команду узла позже

mkdir ~ / opt

./configure --prefix = ~ / opt && make && make install

echo 'export PATH = ~ / opt / bin: $ {PATH}' >> ~ /.bashrC#or ~/.profile или ~/.bash_profile или ~/.zshenv в зависимости от текущей операционной системы

С любым из этих подходов вы сможете сделать следующее без использования sudo

npm install -g module_to_install

ПРОБЛЕМА: У вас (пользователя) нет прав доступа к каталогу.

Мгновенный выход - запустить установку npm с помощью sudo, но это может привести к той же ошибке или неправильной установке.

И изменение владельца каталога не является хорошим вариантом, временным патчем.


Решение / предложение: изменить каталог по умолчанию для npm (из официальных документов)

Сделайте резервную копию вашего компьютера, прежде чем двигаться вперед.

(необязательно) В случае ошибочной установки сначала удалите ее:

npm uninstall <package-name>  # use sudo if you used it while installation
npm cache verify  # or, npm cache clean for npm version below 5.x.x 
  1. Создайте каталог для глобальных установок:

    mkdir ~/.npm-global

  2. Настройте npm для использования нового пути к каталогу:

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

  3. Откройте или создайте ~/.profile или же ~/.bash_profile файл и добавьте эту строку:

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

  4. Вернитесь в командную строку, обновите системные переменные или перезапустите терминал:

    source ~/.profile

  5. (необязательно) Тест: загрузите пакет глобально без использования sudo.

    npm install -g jshint

В моем случае это из-за разрешения ~/tmp. Поэтому я делаю:

sudo chown -R $USER ~/tmp

И это нормально!

Проблема: у вас нет разрешения на запись в каталоги, которые npm использует для хранения глобальных пакетов и команд.

Решение: разрешить разрешение для npm.

Откройте терминал:

команда + пробел, затем введите "терминал"

Введите эту команду:

sudo chown -R $ (whoami) $ (префикс префикса конфигурации npm)/{lib/node_modules,bin,share}

  • Примечание: для этого потребуется ваш пароль.

Это решение позволяет получить разрешение ТОЛЬКО на нужные каталоги, сохраняя другие каталоги в хорошем и безопасном состоянии.

В случае sudo chown -R $(whoami) ~/.npm не работает для вас, или вам нужно нетерминальное командное решение.

Проблема в том, что ваша учетная запись пользователя не имеет разрешения на запись в папку node_modules, поэтому вы можете сделать следующее

  1. Откройте искатель и нажмите cmd + shift + g это откроет перейти в папку с URL

  2. Напишите следующий путь /usr/local/lib/node_modules и нажмите идти

  3. Щелкните правой кнопкой мыши на node_modules папку и выберите Get Info

  4. Прокрутите вниз до sharing & permissions раздел

  5. Разблокировать, чтобы иметь возможность вносить изменения.

  6. Нажмите + и добавьте свой аккаунт

  7. Убедитесь, что вы выбираете Read & Write в выпадающем списке привилегий

Теперь вы сможете устанавливать пакеты без sudo и вопросы разрешения должны быть решены

просто попробуй

      npm rebuild

затем после завершения запустите свою обычную команду

Наилучшим решением было бы то, что обеспечено документацией npm.


Для Ubuntu предлагаемое решение - вариант № 2

Краткие шаги:
Создайте каталог для глобальных установок:
mkdir ~/.npm-global

Настройте npm для использования нового пути к каталогу:
npm config set prefix '~/.npm-global'
npm config get prefix может помочь вам проверить, был ли префикс обновлен или нет. Результатом будет <Ваш домашний каталог> /. Npm-global

Откройте или создайте файл ~/.profile и добавьте следующую строку:
export PATH=~/.npm-global/bin:$PATH

Вернитесь в командную строку и обновите системные переменные:
source ~/.profile

Вместо шагов 2-4 вы также можете использовать соответствующую переменную ENV (например, если вы не хотите изменять ~/.profile):

NPM_CONFIG_PREFIX=~/.npm-global


Для Mac предлагаем решение вариант № 3

В Mac OS вы можете полностью избежать этой проблемы, используя менеджер пакетов Homebrew

brew install node

Ты можешь попробовать это

sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}

В Mac OS X при установке с помощью Homebrew's brew install npm, путь установки /usr/local/share/npm/ с обоими bin/ а также lib/node_modules/ вложенные папки.

Выполнение этой команды для смены владельца на пользователя, вошедшего в систему, должно исправить все это и позволить вам устанавливать глобальные пакеты NPM без sudo,

sudo chown -R $USER ~/.npm /usr/local/share/npm/

оскс доморощенный

Еще одно отличное исправление для правильной настройки NPM - выполните следующие команды:

npm config set prefix '~/.npm_packages'
PATH=$PATH:$HOME/.npm_packages/bin; export PATH

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

      npm install --cache .npm
npm run build --cache .npm

Это создаст локальный .npm папка

Вот как я решил проблему в Windows 8.1:

  • Перейдите к вашей установке nodejs (обычно C:\Program Files\nodejs)
  • Щелкните правой кнопкой мыши по папке node_modules и перейдите в свойства
  • Перейдите на вкладку "Безопасность" и выберите "Дополнительно".
  • Вверху вы увидите "Владелец: СИСТЕМА", нажмите кнопку "Изменить"
  • Введите пользователя, для которого вы хотите разрешения и нажмите Ok
  • Установите флажок в нижней части расширенных настроек "Заменить все записи разрешений дочерних объектов на наследуемые записи разрешений от этого объекта" и нажмите кнопку "ОК".
  • Делайте все, что вам нужно для установки / обновления npm

Джон Папа указывает на историю и причины этой проблемы и дает твердое решение:

Джон Папа предпринимает следующие шаги:

  1. Используйте brew для установки узла без npm
  2. Обновите ваш.bash_profile/.bashrc, чтобы npm и узел знали, где устанавливать и находить пакеты
  3. Используйте brew для обновления узла и npm для обновления самого себя

Надеюсь, это поможет любопытным!

При попытке установить пакеты глобально от имени пользователя root процесс завершится ошибкой.EUIDLOOKUPилиEACCESили испортит разрешения ваших пользовательских глобальных пакетов.

Чтобы понять проблему, я бы посоветовал прочитать этот выпуск. Короче говоря, пытается использовать текущего процесса для запуска сценариев установки, а не какrootно поскольку первоначальный пользователь работает, в то же время предполагая, что пользователь, работающий как root, будет использовать, поэтому будет установлен EUIDEUID .

Вот почему ответ @JHM16, основанный на использовании, должен работать.

Но это не так при установке пакетов внутри сборки контейнера. В контейнерахsudoбудет чаще отсутствовать. И сборка обычно запускается от имени пользователя root.

Конечно, сборку контейнера можно изменить, чтобы запускать эти команды от имени обычного пользователя и строить все от имени этого пользователя. Однако это не сделает сборку более безопасной и может быть нежелательным в некоторых ситуациях.

Итак, в контейнерной сборке вот как вы можете сделатьnpmглобальная установка работает, например, сyarnупаковка.

      # setpriv --ruid 0 --euid 0 npm --unsafe-perm install -g yarn

setprivэто небольшая утилита низкого уровня, которая должна быть доступна или легко устанавливается в любом дистрибутиве Linux.

На самом деле, у меня тоже была такая же проблема. Я работал под управлением Ubuntu. Моя проблема возникает из-за того, что я потерял свой открытый ключ Ubuntu. Даже обновление моей системы не происходило. Это давало ошибку GPG. В этом случае вы можете восстановить свой ключ с помощью этой команды:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <key in GPG error>

После этого npm работает нормально!

Use below command while installing packages

 sudo npm install --unsafe-perm=true --allow-root
Другие вопросы по тегам