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, чтобы легко с ними играть. Идеально подходит для разработки.
- Удалите Node (вероятно, потребуется разрешение root). Это может помочь вам.
- Затем установите NVM, следуя инструкциям на этой странице.
- Установить узел через 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
Вам нужно разблокировать разрешения в вашем
home
каталог, как Noah говорит:sudo chown -R `whoami` ~/.npm
Вам также необходимо разрешение на запись в
node_modules
каталог, как говорит Xilo, так что если он все еще не работает, попробуйте:sudo chown -R `whoami` /usr/local/lib/node_modules
Если вы все еще видите ошибки, вам также может потребоваться исправить
/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.
Найдите путь к каталогу npm:
npm config get prefix
Для многих систем это будет / usr / local.
ВНИМАНИЕ: Если отображаемый путь - просто / usr, переключитесь на Вариант 2.
Измените владельца каталогов 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 для использования другого каталога. В нашем случае это будет скрытый каталог в нашей домашней папке.
Создайте каталог для глобальных установок:
mkdir ~/.npm-global
Настройте npm для использования нового пути к каталогу:
npm config set prefix '~/.npm-global'
Откройте или создайте файл ~/.profile и добавьте следующую строку:
export PATH=~/.npm-global/bin:$PATH
Вернитесь в командную строку и обновите системные переменные:
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, в которой рассказывается, как правильно установить, не мешая с разрешениями:
Вот способ установить пакеты глобально для данного пользователя.
Создайте каталог для ваших глобальных пакетов
mkdir "${HOME}/.npm-packages"
Ссылка на этот каталог для будущего использования в вашем.bashrc/.zshrc:
NPM_PACKAGES="${HOME}/.npm-packages"
Укажите npm, где хранить ваш глобально установленный пакет. В вашем
$HOME/.npmrc
добавление файла:prefix=${HOME}/.npm-packages
Убедитесь, что узел найдет их. Добавьте следующее в ваш.bashrc/.zshrc:
NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"
Убедитесь, что вы найдете установленные двоичные файлы и справочные страницы. Добавьте следующее к вашему
.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 установить что-то), потому что некоторые проблемы могут возникнуть позже **
Для Mac (взято из ответа Кристопера Уилла)
Mac OS X 10.9.4
Системные настройки> Пользователи и группы> (разблокировать) > нажмите +:
Новая учетная запись> "Группа"
Имя учетной записи: nodegrpПосле создания группы отметьте пользователя, который будет включен в эту группу.
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
Создайте каталог для глобальных установок:
mkdir ~/.npm-global
Настройте npm для использования нового пути к каталогу:
npm config set prefix '~/.npm-global'
Откройте или создайте
~/.profile
или же~/.bash_profile
файл и добавьте эту строку:export PATH=~/.npm-global/bin:$PATH
Вернитесь в командную строку, обновите системные переменные или перезапустите терминал:
source ~/.profile
(необязательно) Тест: загрузите пакет глобально без использования 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, поэтому вы можете сделать следующее
Откройте искатель и нажмите
cmd
+shift
+g
это откроет перейти в папку с URLНапишите следующий путь
/usr/local/lib/node_modules
и нажмите идтиЩелкните правой кнопкой мыши на
node_modules
папку и выберитеGet Info
Прокрутите вниз до
sharing & permissions
разделРазблокировать, чтобы иметь возможность вносить изменения.
Нажмите
+
и добавьте свой аккаунтУбедитесь, что вы выбираете
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
Джон Папа указывает на историю и причины этой проблемы и дает твердое решение:
Джон Папа предпринимает следующие шаги:
- Используйте brew для установки узла без npm
- Обновите ваш.bash_profile/.bashrc, чтобы npm и узел знали, где устанавливать и находить пакеты
- Используйте 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