Модули NPM не будут устанавливаться глобально без sudo

126

Я только что переустановил Ubuntu 12.04 LTS и прежде всего проделал следующие шаги :

  1. Установлен узел через диспетчер пакетов со следующим скриптом

    sudo apt-get update
    
    sudo apt-get install python-software-properties python g++ make
    
    sudo add-apt-repository ppa:chris-lea/node.js
    
    sudo apt-get update
    
    sudo apt-get install nodejs
    
  2. Пытался установить генераторы yeoman, express, n, yeoman глобально, и все они вернули одну и ту же ошибку

    npm ERR! Ошибка: EACCES, символическая ссылка '../lib/node_modules/n/bin/n'

    npm ERR! {[Ошибка: EACCES, символическая ссылка '../lib/node_modules/n/bin/n'] номер ошибки: 3, код: 'EACCES', путь: '../lib/node_modules/n/bin/n'}

    npm ERR!

    npm ERR! Пожалуйста, попробуйте запустить эту команду еще раз от имени пользователя root / администратора.

    npm ERR! Система Linux 3.8.0-29-generic

    npm ERR! команда "/ usr / bin / node" "/ usr / bin / npm" "install" "-g" "-d" "n"

    npm ERR! cwd / home / heberlz

    npm ERR! узел -v v0.10.20

    npm ERR! npm -v 1.3.11

    npm ERR! путь ../lib/node_modules/n/bin/n

    npm ERR! код EACCES

    npm ERR! ошибка 3

    npm ERR! Ошибка стека: EACCES, символическая ссылка '../lib/node_modules/n/bin/n'

    npm ERR!

    npm ERR! Дополнительные сведения о регистрации можно найти в:

    npm ERR! /home/heberlz/npm-debug.log

    npm ERR! не в порядке код 0

  3. Рекурсивно восстановлено право собственности на следующие папки ~ / .npm, / usr / lib / node, / usr / lib / node_modules и следующие символические ссылки / usr / bin / node, / usr / bin / nodejs, но безуспешно.

Мне нужно установить yeoman и его генераторы без sudo, чтобы потом не было проблем :(

HeberLZ
источник
Спасибо, Фил, теперь это выглядит намного лучше
HeberLZ
2
Если вы хотите, чтобы npm устанавливал глобальные пакеты в $ HOME, а не в / usr, следуйте руководству github.com/sindresorhus/guides/blob/master/…
полковник Паник,
это то, что сработало для меня github.com/nodejs/node-v0.x-archive/issues/… :ln -s /usr/bin/nodejs /usr/bin/node
Лоик МИШЕЛЬ
Возможный дубликат npm выдает ошибку без sudo
Луи

Ответы:

318

Ubuntu 12.04 и использование PPA Криса Ли для установки у меня работает следующим образом:

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

и добавив $ HOME / .npm-packages / bin в $ PATH

добавить к .bashrc

export PATH="$PATH:$HOME/.npm-packages/bin"

см. https://stackoverflow.com/a/18277225 из @passy

ErikAndreas
источник
9
Похоже, это гораздо более чистое решение. Если вам не нравятся системные папки в вашем домашнем каталоге, вы также можете использовать такое расположение, как ~ / .local / share / npm.
JeroenHoek
Следует отметить, что после изменения префикса необходимо переустановить все глобальные модули, которые вы установили ранее, включая сам npm.
Dziamid
Кажется, это нормально, но мне было гораздо проще дать пользователю разрешение на запись /usr/lib/node_modules/. Или, может быть, даже целесообразно создать группу Unix nodejs и дать этой группе разрешение на запись в этот каталог.
mehulkar
Следует добавить небольшую деталь: вы должны сами создать каталог ~ / npm. В противном случае npm завершится с ошибкой ENOENT.
Джейсон Фарнсворт
6
Почему это не по умолчанию для npm? Спасибо, что поделился.
Дориан
23

Если у вас уже есть $HOME/binна вашем пути, более простое решение просто ...

npm config set prefix ~
  • Новые команды узла теперь будут установлены в ваш $HOME/binкаталог.
  • Не нужно менять свой путь!

Поскольку это обсуждение действительно касается снижения рисков безопасности при запуске sudo, вы также должны знать, что любое приложение узла потенциально может устанавливать приложение, имя которого не соответствует зарегистрированному имени пакета узла, который, по вашему мнению, вы устанавливаете. Таким образом, существует риск того, что команда npm installзаменит существующую системную команду или команду, которая у вас уже есть $HOME/bin. Если вас беспокоит, проверьте bin, и scriptsсвойство в package.jsonфайле приложения вы устанавливаете первый.

В общем, безопаснее всего:

  • (а) Поместите $HOME/binпоследний в своем пути, чтобы системные команды не заменялись.
  • (б) не включать "." или любой относительный путь в вашем, $PATHчтобы вы случайно не запустили команду, которая находится в текущем каталоге.

Ссылка:

Тони О'Хаган
источник
1
Еще одна важная проблема безопасности npmзаключается в том, что исходный код, который вы видите в github.comрепозитории для пакета узла, может не совпадать с кодом, который вы устанавливаете с npm.orgсервера реестра!
Тони О'Хаган
Хотя теоретически хорошо созданный пакет узла будет успешно установлен ~/bin, некоторые пакеты узлов (или их зависимые пакеты) были протестированы только как устанавливаемые, sudoпоэтому имейте в виду, что вы можете столкнуться с непроверенной проблемой «среды установки». Как и в случае с любой другой проблемой среды (например, смена ОС), принцип «пиши один раз, тестируй везде» все еще остается в силе.
Тони О'Хаган
Недостатком этого метода является то, что npm создает дополнительный каталог с именем ~ / lib. В зависимости от практики вашей организации это может быть нежелательно.
Mr. S
12

По состоянию на октябрь 2014 г .:

Node.js доступен из репозитория двоичных дистрибутивов NodeSource Debian и Ubuntu .

curl -sL https://deb.nodesource.com/setup | sudo bash -
sudo apt-get install -y nodejs

Вот и все.

Устаревший ответ:

Самый быстрый способ без использования sudo описан здесь isaac

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

Вместо этого я рекомендую сделать это один раз:

sudo chown -R $USER /usr/local

РЕДАКТИРОВАТЬ:

Существуют определенные проблемы безопасности и ограничения функциональности, связанные с передачей права собственности на / usr / local текущему пользователю:

Сказав это, если вы хотите установить глобальный модуль без использования sudo, я не вижу лучшего решения (с прагматической точки зрения), чем упомянуто. Безопасность и простота использования - это очень обширная тема, и на нее нет простого ответа - все зависит от ваших требований.

Андрей Карпушонак
источник
23
Это плохая идея, потому что из-за этого все / usr / local принадлежат одному пользователю.
Рид Дж. Ло
4
Как отметил @ ReedG.Law, это действительно плохая идея. Не передавайте права собственности на / usr / local какому-либо конкретному пользователю.
Кристофер Уилл
3
Я должен согласиться с законом Рида Джи - изменение / usr / local - ПЛОХАЯ ПЛОХАЯ идея. В моем случае я искал направления и сделал это: затем вспомнил, что я должен ПОДЕЛИТЬСЯ этим с другим человеком, занимающимся разработкой. Я вернулся и (надеюсь) получил все изменения. Это не только безопасность, но и функциональность.
Ллойд Сарджент
3
Есть ли обратная сторона этого решения, если в системе только один пользователь ?
connorbode
2
Извините, имел в виду /usr/local/lib/node_modulesиnode
Крейндерс
11

Проблема заключалась в том, что я установил узел с помощью sudo , чтобы избежать ошибок при установке модулей npm по всему миру, НИКОГДА НЕ ДОЛЖЕН устанавливать узел с помощью sudo.

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

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

tar -zxf node-v0.10.20.tar.gz # распаковать исходники

cd node-v0.10.20 # введите несжатую папку

sudo chown -R $ ПОЛЬЗОВАТЕЛЬ / usr / local

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

Следует отметить, что в моем случае не сработает только владение папкой / usr / local, потому что сама установка узла была произведена с помощью sudo

Последний шаг для установки yeoman: # хотя на yeoman.io сказано, что выполнение "npm install -g yo" уже устанавливает bower и grunt, есть некоторые подмодули grunt, которые не работают, поэтому я исправил это, установив его самостоятельно

npm install -g bower

npm install -g grunt

npm install -g yo

npm установить -g генератор-угловой

HeberLZ
источник
Отлично в теории, но есть ли способ добиться того же эффекта без необходимости создавать Node и устанавливать 4 дополнительных модуля, чтобы иметь доступ к модулям во всем мире?
Дэн Ниссенбаум
Выбранный ответ работает именно так, как вам нужно. Это то, что я сделал 2 года назад, когда еще не было другого общедоступного решения, но теперь оно бесполезно
HeberLZ
5

Я решил эту проблему с помощью переменной окружения и псевдонима оболочки:

export NPM_PREFIX=$HOME/node
alias npmg="npm -g --prefix $NPM_PREFIX"

Для меня npm не соблюдал настройку конфигурации "префикс" в .npmrc.

santervo
источник
2

Согласно этому аналогичному сообщению SO: npm выдает ошибку без sudo

Похоже, у вас может быть проблема с владельцем ~/.npmкаталога.

Как и в этом случае, попробуйте:

sudo chown -R `whoami` ~/.npm
prasanthv
источник
На самом деле это не сработало, как я объяснил на шаге 3 того, что я пробовал, когда не мог заставить его работать, проблема заключалась в том, что я установил узел с помощью sudo, что при некоторых обстоятельствах может вызвать проблемы. Как только я удалил узел и переустановил его из исходных кодов, все начало работать, как ожидалось!
HeberLZ 05
@HeberLZ Я думаю, ты прав, я просто пытался сделать это вчера вечером на другой машине, и это не сработало. У меня были и другие проблемы с разрешениями. Все еще не уверен, как лучше не запускать эту установку npm из исходников.
prasanthv
Ссылка на вопрос в комментариях или отметка текущего вопроса как дублирующего. Копирование ответов на другие вопросы не помогает.
givanse
@HeberLZ, голос против этого ответа неуместен, поскольку он касается заголовка заданного вами вопроса.
Себастьян Састре
Я не помню, когда я проголосовал против ответа, но в моем конкретном случае то, что вы написали, не устранило проблему, поэтому я думаю, что я, вероятно, проголосовал против ответа. Как указано в вопросе: "Рекурсивно восстановлено право собственности на следующие папки ~ / .npm, / usr / lib / node, / usr / lib / node_modules и следующие символические ссылки / usr / bin / node, / usr / bin / nodejs без особого успеха "Я пытался получить право собственности на .npm и все другие папки безуспешно
HeberLZ
2

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

npm config get prefix

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

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

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

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

Вот ссылка для получения полной информации

https://docs.npmjs.com/getting-started/fixing-npm-permissions

Монис Маджид
источник
Жизненно важно. Старайтесь не добавлять binи shareв скобки. Игнорирование может привести к смене владельца этих папок на текущего пользователя и проблемам с установкой новых пакетов в систему, sudoпотому что его право собственности также будет изменено
А.Аметов
эта рекомендация уничтожает всю мою файловую систему: (
UA_
1

Если вы работаете на разрабатываемой машине, возможно, вам лучше подумать об использовании nvm .

Если нет, вы просто хотите установить, используя свой любимый менеджер пакетов.

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

Ям Зеш
источник
1

На самом деле, я просто изменил разрешение папки пользователя, которая принадлежала root:

sudo chown -R $USER ~/.config/configstore

Тогда я мог бы "npm install" и "bower install" без sudo! Сработало нормально!

Vinggui
источник
0

используя lubuntu 14.04.3, я попытался сменить владельца префикса .npm и npm, обновил свой путь, модули, установленные npm, в мой домашний каталог без sudo, но путь был неправильным, поэтому такие модули, как ember, не были найдены, linuxbew быстро решил проблему руководство по настройке здесь для узла / npm

Конор
источник
0

Эту и другие проблемы, вызванные той же причиной, можно решить, установив Node в пользовательском пространстве.

Вы можете сделать это, просто скопировав и вставив в свой терминал

NODEJS_ROOT=${NODEJS_ROOT:-~/nodejs}
cd /tmp
wget -N http://nodejs.org/dist/node-latest.tar.gz && tar xzf node-latest.tar.gz
NODEJS_CURRENT=$(tar tf node-latest.tar.gz|head -1)
mkdir -p $NODEJS_ROOT/$NODEJS_CURRENT
cd $NODEJS_CURRENT
./configure --prefix=$NODEJS_ROOT/$NODEJS_CURRENT && make install
cd $NODEJS_ROOT
rm current 2> /dev/null # Removes current symbolic link, if any
ln -s $NODEJS_CURRENT current

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

Не забудьте отредактировать свое окружение. Только один раз сделать

echo "export NODEJS_ROOT=$NODEJS_ROOT"            >> $HOME/.bash_profile
echo 'export PATH=$NODEJS_ROOT/current/bin:$PATH' >> $HOME/.bash_profile
source $HOME/.bash_profile # reload your env, so you can use node right now

Прочтите эту статью, чтобы узнать, как установить Node.js без sudo .

Для более общего решения по этой теме (например, установка программного обеспечения локально) см. Dotsoftware .

Джанлука Касати
источник
0

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

https://github.com/nvm-sh/nvm

Марко Налис
источник
-2

Лучшим решением, которое я нашел, было установить Node.js из пакета tar в домашний каталог пользователя и связать местоположение папки lib. Вот что вам нужно сделать

Это установит Nodejs в ~ / .local / вместо / usr / local / по умолчанию.

Add this to your ~/.npmrc (create the file if it doesn't exist already):

root =    /home/YOUR-USERNAME/.local/lib/node_modules
binroot = /home/YOUR-USERNAME/.local/bin
manroot = /home/YOUR-USERNAME/.local/share/man
Download the Nodejs source code from nodejs.org and install it under your ~/.local tree:

tar xf node......
cd node........
./configure --prefix=~/.local
make
make install

Create ~/.node_modules symlink. (This directory will be automatically searched when you load modules using require "module" in scripts. I'm not sure why Node doesn't search ~/.local/lib/node_modules by default.)

cd
ln -s .local/lib/node_modules .node_modules
Is ~/.local/bin in your path? Type

which npm
If it says ~/.local/bin/npm, you're done.

Otherwise, do this...

export PATH=$HOME/.local/bin:$PATH
...and add that line to your ~/.profile file, so it'll run every time you log in.

Если вы по-прежнему сталкиваетесь с ошибкой владения или разрешения при установке пакетов, измените владельца ~ / .local / dir, запустив

chown -R user:user ~/.local/

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

Примечание: ВСЕ ВЫШЕУКАЗАННЫЕ КОМАНДЫ ДОЛЖНЫ ВЫПОЛНЯТЬСЯ ОТ ПОЛЬЗОВАТЕЛЯ. НЕ ИСПОЛЬЗУЙТЕ СУДО ИЛИ ROOT LOGIN

НИКОГДА НЕ ИЗМЕНЯЙТЕ РАЗРЕШЕНИЕ НА ПАПКИ ПОД '/ USR / LIB /'. ПРИВЕДЕТ К НЕСТАБИЛЬНОЙ ОС

Shank_Transformer
источник
1
Скопировано с tnovelli.net/blog/blog.2011-08-27.node-npm-user-install.html без указания авторства.
Тобу
-2

Я считаю объяснения Павла Гржибека очень убедительными: они сводятся к 3 простым командам sudo, которым больше не нужно использовать sudo для глобальной установки npm:

sudo chown -R $(whoami) /usr/local/lib/node_modules
sudo chown -R $(whoami) /usr/local/bin
sudo chown -R $(whoami) /usr/local/share
Фрэнк Нок
источник