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


1288

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

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

35
Пожалуйста, рассмотрите решение с использованием NVM : stackoverflow.com/a/24404451/1480391 (вместо взлома с разрешениями)
Ив М.

2
@janaspage Вы не можете установить узел или NVM (Node Version Manager) через NPM (Node Package Manager), это не имеет смысла. NPM входит в узел (он устанавливается одновременно). Взгляните на страницу Википедии: en.wikipedia.org/wiki/Npm_(software)
Ив М.

5
Наконец, решение лучше, чем sudo chown: github.com/sindresorhus/guides/blob/master/…
Дмитрий Зайцев,

Под OSX и установкой узла с официальным инсталлятором pkg это решение не сработало. Я использовал этот вместо: stackoverflow.com/a/34968008/675565
fmquaglia

2
Это объясняет проблему и исправить: docs.npmjs.com/getting-started/fixing-npm-permissions
n00b

Ответы:


2269

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

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

102
Я думал, что whoamiэто заполнитель, но он работает буквально как есть, поэтому это должна быть переменная, которую я не понимаю.
SimplGy

127
whoami - это настоящая команда оболочки en.wikipedia.org/wiki/Whoami . Задние черты вокруг whoamiгарантируют, что это выполнено правильно и затем помещено в команду chown
Ноа

13
Вы также можете вручную указать свое имя пользователя. Если ваше имя пользователя «simpleascouldbe», команда будетsudo chown -R simpleascouldbe ~/.npm
Noah

13
npm НЕ требует и не должен использовать sudo - смотрите ответ ниже @HeberLZ, в частности, его второй вариант, касающийся: ./configure --prefix = xxxxxx
Скотт Стенсланд,

9
@ChristopherWill: это не меняет владельца системного каталога. Это меняет владельца каталогов в домашнем каталоге пользователя, который должен принадлежать пользователю.
user4815162342

620

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

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


Решение 1: NVM

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

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

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

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

Теперь npm link,npm install -g больше не будет требовать от вас быть корнем.

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


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

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

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

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

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


32
Из всех размещенных решений решение NVM здесь дало лучшие результаты для меня. Настоятельно рекомендуем использовать NVM, а не играть с разрешениями.
wenincode

9
Эти инструкции работали очень хорошо. Однако вы, вероятно, захотите удалить модули, которые вы установили с помощью sudo, перед удалением nodejs : npm ls -gp | awk -F/ '/node_modules/ && !/node_modules.*node_modules/ {print $NF}' | xargs npm -g rm- Мне пришлось переустанавливать nodejs и в корневой оболочке и удалять их, иначе у вас останутся символические ссылки на yo, grunt и т. Д.
Бруно Флавио

4
Это лучшее решение, я удалил все модули, сначала выполнив sudo npm list -g --depth=0. | awk -F ' ' '{print $2}' | awk -F '@' '{print $1}' | sudo xargs npm remove -g stackoverflow.com/a/22290968/1449157, а затем удалил npmи установил его черезnvm
Fabio Antunes,

3
Для инструкций по удалению для узла используйте этот SO ответ stackoverflow.com/a/11178106/480031
seangates

3
Почему нормально использовать root для установки узла на рабочий компьютер?
Бруно Перес

401

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

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

7
Как и ~/tmpкаталог для меня.
известноасиля

123
Я не знаю, почему это до сих пор вызывает голоса. Это очень плохая практика - менять владельца системных каталогов на конкретного пользователя! Пожалуйста, смотрите ответ ниже для других решений (например, создание отдельной группы для пользователей узла).
Кристофер Уилл

1
у меня нет node_modulesв /usr/local/lib/. WTF?
Коннор Лич,

27
Что бы вы ни делали - АБСОЛЮТНО не запускайте 'sudo chmod -R whoami' в / usr / local / lib или / usr / lib /, вы испортите файл sudoers и будете ненавидеть себя.
qodeninja

7
всем, пожалуйста, понизьте это ... Then I ran sudo chown -R $USER /* and everything was fine- НЕТ - вы разрушаете свою машину.
commonpike

75

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

npm config set prefix ~/npm

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

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

См @ErikAndreas " ответ на модули НПХ не будет устанавливать глобально без Суда и более руководства шага за шагом по @sindresorhus с также наборами $MANPATH.


Я полностью согласен, за исключением того, что я бы предложил, если вы просто установите префикс на $HOMEто, как правило, ваш .profileскрипт позаботится о $PATHследующем вашем исходном коде (например, при следующем входе в систему).
Джесс Остин

@JessAustin: Возможно, но это также принесет больше беспорядка $HOMEи может помешать другим (будущим?) Файлам / подпапкам NPM. Предпочитают хранить двоичные файлы из разных менеджеров пакетов / языков / систем сборки отдельно и $PATHвместо этого явно указывать (в сценарии времени входа в систему).
Джоэл Пурра

Ах, беспорядок? Мы просто говорим о глобально установленных модулях ~/lib/node_modulesс соответствующими CLI, если таковые существуют, в ~/bin. Для многих пользователей, особенно если они не имеют корня, как ~/binи ~/libуже существуют.
Джесс Остин

@JessAustin: это также вопрос конфликтов имен для библиотек и двоичных файлов. Допустим, вы указываете NPM на установку бинарных файлов, ~/binа затем делаете то же самое для одного или двух дополнительных менеджеров пакетов. Это может не произойти ни сегодня, ни завтра, но существует явный риск того, что два пакета от разных менеджеров столкнутся с именами и перезаписывают файлы друг друга. Это достаточно хороший случай для меня, чтобы иметь отдельные префиксы. (Конкретные примеры будут оценены.)
Джоэл Пурра

1
Это должно быть принято как лучший ответ. Изменение системных глобальных папок может быть опасным.
Владимир Мартон

58

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

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

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

    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, смотрите Ответ Кристофера Уилла ниже для многопользовательского, системно-безопасного решения (но более сложного).


35
Это плохая идея. Возможно, вы не хотите, чтобы системные каталоги принадлежали конкретному пользователю. Помимо серьезных проблем безопасности это также не совместимо с несколькими пользователями.
Кристофер Уилл

2
Да, но это отличное решение для среды разработки +2, особенно если вы уже установили node.js и вам просто нужно продолжать работу!
Elliotrock

Вы действительно не должны владеть пакетами за пределами вашего домашнего каталога
Ben

1
Если его нет в вашей домашней папке, это системный каталог, несмотря на любые претензии об обратном. То, что он не используется OS X, не означает, что это не системный каталог.
Богатый Ремер

53

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

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

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

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

npm config get prefix

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

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

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

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

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

я должен только переключиться на вариант 2, если я получил / usr?
Альберт Лор

3
Обратите внимание, что последняя команда фактически выводит содержимое $PATH, а не саму строку. Вы должны изменить это.
Велурия

1
Это исправлено! Спасибо. Я получал «Отказано в разрешении, отменил связь» / usr / bin / <pkg> '
valbaca

1
Это лучший ответ. Это рекомендуемый способ решения проблемы.
Пауло Коги - Восстановить Монику

Почему угроза безопасности?
Фрэнк

40

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

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

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

# 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 . Это сэкономит вам много времени и хлопот.


2
Если узел установлен по источникам, хотя многопользовательские проблемы могут возникнуть, все модули будут работать без использования sudo. Это также очень важно, потому что в случае с модулем yeoman люди не могут обновлять генераторы с помощью sudoing приложения yeoman, так как оно не позволяет выполнять sudo :(
HeberLZ

1
В Linux я обычно использую встроенную staffгруппу для предоставления разрешений моим папкам разработчиков. Кроме того, рекомендуется запустить программу, chmod g+ws node_modulesчтобы убедиться, что ваша группа имеет разрешение на чтение / запись.
Jackvsworld

@jackvsworld Я не знал о группе сотрудников. Я думаю, это было бы более плавное решение, так как не нужно создавать новую фиктивную группу ... хотя это было бы менее явно. Но спасибо за этот вклад.
Кристофер Уилл

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

23

Официальная документация о том , как исправить npm installразрешения с EACCESошибкой находится в https://docs.npmjs.com/getting-started/fixing-npm-permissions .

Я столкнулся с этой проблемой после новой установки узла с использованием .pkgустановщика на OSX. Здесь есть несколько отличных ответов, но я еще не видел ссылку на npmjs.com.

Вариант 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

1
Спасибо, этот сработал для меня, так как решение chown не сработало. Ты спас меня.
fmquaglia

я должен только переключиться на вариант 2, если я получил / usr?
Альберт Лор

Мне нравится вариант 2 ответа. (1) У него нет уязвимостей безопасности при использовании sudo, (2) он сохраняет архитектуру для других пользователей, (3) он ссылается на документацию, И (4) он имеет необходимую командную строку Записи включены. Спасибо тебе за добавление!
Том Роуз

Так что же происходит, когда вы устанавливаете что-то, на что есть ссылки /usr/bin/? Теперь только ваш пользователь может получить к нему доступ. Вы входите в систему как кто-то еще, но у вас все еще нет доступа, так как файлы на самом деле находятся в домашнем каталоге другого пользователя!
Франс

Хорошо, этот работал для меня. Спасибо за объяснение в дополнение к командам.
FrankByte.com

12

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

У Sindre Sorus есть руководство Установка глобальных пакетов 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 для выполнения вышеупомянутых шагов автоматически

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


2
TX для редактирования @AndyHayden :) Мой предпочтительный метод предлагается в комментариях выше: используйте NVM! stackoverflow.com/a/24404451/1480391
Ptim

Единственное решение, которое сработало для меня, которое не включает в себя взломать разрешения. Я ненавижу NPM и его глупость идиотских разрешений. Спасибо за решение!
RyanNerd

8

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.


лучшее и простое исправление
Манджит Сингх

6

У меня была похожая проблема: модули 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


1
Я закончил тем, что использовал этот метод. Использовал sudo chown $USER /use/localперед сборкой. Выглядит хорошо до сих пор, время, чтобы попытаться построить атом! Спасибо!
prasanthv

6

Когда вы запускаете 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/


Ура! этот сделал это со мной! после выполнения других других из них выше: sudo chown -R `whoami` ~/.npm, sudo chown -R `whoami` /usr/local/libи
Regis Залемана

8
Это может вызвать проблемы с разрешениями у многих других приложений, поэтому я бы посоветовал не делать этого. Зачем обменивать одну банку червей на другую?
Брэд Паркс

1
Или, по крайней мере, уточните его до / usr / local / lib / node_modules.
Кен

Это, это и многое другое. После того, как я ударился головой о стену, это помогло. +1
приборная панель

Это была моя проблема. В новом macbook (os x 10.10.3) разрешения для / usr / local / lib / node_modules были следующими: $ ll / usr / local / lib / node_modules всего 0 drwxr-xr-x 3 24561 колесо 102B 31 марта 18:19 , drwxrwxr-x 4 24561 admin 136B 31 марта 18:19 .. drwxr-xr-x 26 65534 сотрудников 884B 13 апреля 10:53
вечера

5

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

Mac OS X 10.9.4

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

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

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

  2. sudo chgrp -R nodegrp / usr / local / lib / node_modules /
    sudo chgrp nodegrp / usr / bin / узел
    sudo chgrp nodegrp / usr / bin / npm
    sudo chown -R $ (whoami): узелgrp ~ / .npm


1
Мне пришлось изменить несколько путей к / usr / local / bin, но в остальном это решение отлично работало на моей машине OX X 10.9 - спасибо!
Spig

Плохая практика смены владельца системных каталогов.
Богатый Ремер

@ Richremer Я думаю, это зависит от того, чего ты пытаешься достичь. если папка изначально доступна только пользователю sudoer, ее можно изменить только таким способом. мы ограничиваем изменение папкой, связанной с npm. Будет ли безопаснее сохранять sudoили изменять владельца группы папок, чтобы его мог изменить обычный пользователь? Если обычный пользователь не должен выполнять какие-либо действия с этой папкой, то, конечно, не следует менять владельца группы для этой папки.
кен

Для этого нужно установить глобальные пакеты с помощью sudo, но сделать это с -Hфлагом. В частности, sudo -H npm install -g <pkg>. Это обеспечивает правильное разграничение разрешений для системных и пользовательских папок. То, что вы не хотите делать, это использовать sudo npm install -g, потому что это устанавливает файлы, принадлежащие пользователю root, в ваш пользовательский каталог. Было бы замечательно, если бы npm были достаточно умны, чтобы сделать это правильно, но это не так, поэтому вы должны использовать -Hфлаг sudo для правильной установки глобально.
богатый Ремер

4

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

sudo chown -R $USER ~/tmp

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


4

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

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

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


Вы очень
классный,

Файлы в /usr/libявляются системными файлами и не должны принадлежать вашей личной учетной записи пользователя.
богатый ремер

4

ВОПРОС : У вас (пользователя) нет прав доступа к каталогу.

Мгновенный выход - запустить установку 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


3

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

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

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

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

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

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

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

  6. Нажмите +и добавьте свою учетную запись

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

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


3

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

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

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

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

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

sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
  • Примечание: для этого потребуется ваш пароль.

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


Понижающее голосование, потому что установка прав владения системными папками для пользователей является антишаблоном, и это не учитывает этого. В особом случае, когда что- npm config get prefixто возвращается в домашнюю папку, это решение исправит разрешения, но не решит основную проблему безопасной установки глобальных пакетов для общей среды.
богатый ремер

Это перезапишет разрешения огромной части операционной системы. Например, выполнение этого в Ubuntu приведет к тому, что сама команда «sudo» станет непригодной для использования.
Саханд Сейфи

2

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

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

2

Вы можете попробовать это, работает на Ubuntu и Mac

sudo chown -R $(whoami) /usr/local/lib/node_modules

1
Я запустил это и 100% работал для меня на Mac: sudo chown -R $ (whoami) / usr / local / lib / node_modules
leeroya

1

Мне кажется, что лучший вариант - это вариант, предложенный в документации по npm , который сначала проверяет, где установлены глобальные модули node_modules по умолчанию npm config get prefix. Если вы получите, как я на Трасти,/usr вы можете изменить его на папку, которую вы можете безопасно хранить, не путая вещи, как я.

Для этого выберите или создайте новую папку в своей системе. Возможно, вы захотите иметь его в своем домашнем каталоге или, как и я, /usr/localдля согласованности, потому что я также пользователь Mac (я предпочитаю не смотреть в разные места в зависимости от машины, перед которой я оказался). Еще одна веская причина для этого - тот факт, что /usr/localпапка, вероятно, уже находится в вашей переменной PATH (если вы не хотите возиться с вашей переменной PATH), но есть вероятность, что ваша вновь созданная папка отсутствует, и вам нужно добавить ее в ПУТЕШЕСТВУЙТЕ в своем профиле .bash или в файле .bashrc .

Короче говоря, я изменил расположение глобальных модулей по умолчанию npm config set prefix '/usr/local', создал папку /usr/local/lib/node_modules(она будет использоваться npm) и изменил разрешения для папок, используемых npm, с помощью команды:

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

Теперь вы можете безопасно установить любой модуль по всему миру. Надеюсь это поможет!


1

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

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

1

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


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

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

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

Откройте или создайте файл ~ / .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


Этот NPM_CONFIG_PREFIX не будет работать. Это ошибка в npm-описании. Смотрите мой пост выше, как это сделать правильно: stackoverflow.com/a/41395398/1256697
suther

1

Я решаю это путем смены владельца от root до моего имени пользователя

sudo chown -R me:me /home/me/.config/configstore/

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


1

Мне нравится использовать группы Ubuntu для достижения этой цели вместо смены владельца. Это довольно просто.

  1. Сначала установите nodejs и npm, используя apt-get

    sudo apt-get update && sudo apt-get install nodejs npm

  2. Выясните, кто вошел в систему, т.е. имя пользователя, выполните следующую команду, чтобы увидеть его в терминале

    whoami

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

    groups

  4. Запустите следующую, чтобы разрешить доступ зарегистрированному пользователю

    sudo chmod 777 -R /usr/local && sudo chgrp $(whoami) -R /usr/local

  5. Обновите npm и nodejs

    npm install -g npm

Вы настроены, ваш пользователь может запускать команды npm без sudo

Вы также можете обратиться по этой ссылке https://askubuntu.com/a/1115373/687804


0

В Mac OS X при установке с помощью Homebrew brew install npm путь установки указывается /usr/local/share/npm/как в подпапках, так bin/и в lib/node_modules/подпапках.

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

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


1
В настоящее время рекомендую мой другой ответ на этот вопрос, который использует npm configвместо этого.
Джоэл Пурра

0

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

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

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


0

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

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

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

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


0

Это решение, которое я использовал и работал. Я пытался использовать whoamiникогда не работал.

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

тогда

sudo chown -R $USER /usr/local/bin/npm

тогда

sudo chown -R $USER /usr/local/bin/node


0

Ответ @ Yves M. был очень похож на мое решение. Вот команды, которые я использовал, которые немного отличались от его.

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash

Затем запросите последнюю версию:

nvm ls-remote

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

nvm install YOUR_VERSION_HERE

пример

nvm install v5.8.0
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.