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

104

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

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

    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
    
  • Пытался установить yoman, express, n, yoman генераторы глобально, и все они вернули ту же ошибку

    npm ERR! Ошибка: EACCES, symlink '../lib/ node_modules/n/bin/n'

    npm ERR! {[Ошибка: EACCES, symlink '../lib/ node_modules/n/bin/n'] errno: 3, код: 'EACCES', путь: '../lib/node_modules/n/bin/n '}

    npm ERR!

    npm ERR! Повторите попытку запуска этой команды как root/Administrator.

    npm ERR! System Linux 3.8.0-29-generic

    npm ERR! команда "/usr/bin/ node" "/usr/bin/npm" "установить" "-g" "-d" "n"

    npm ERR! cwd/home/heberlz

    npm ERR! Node -v v0.10.20

    npm ERR! npm -v 1.3.11

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

    npm ERR! код EACCES

    npm ERR! errno 3

    npm ERR! stack Error: EACCES, symlink '../lib/ node_modules/n/bin/n'

    npm ERR!

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

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

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

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

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

Показать ещё 2 комментария
Теги:
npm
node-modules
yeoman

13 ответов

307
Лучший ответ

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

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

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

добавить к .bashrc

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

см. https://stackoverflow.com/questions/18212175/npm-yeoman-install-generator-angular-without-sudo от @passy

  • 8
    Это выглядит как гораздо более чистое решение. Если вам не нравятся системные папки в вашем домашнем каталоге, вы также можете использовать местоположение, например ~ / .local / share / npm.
  • 0
    Следует отметить, что после изменения префикса вам следует переустановить все глобальные модули, которые вы установили ранее, включая сам npm.
Показать ещё 4 комментария
17

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

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

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

В целом, он безопаснее:

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

Ссылка:

  • 0
    Другая важная проблема безопасности с npm заключается в том, что исходный код, который вы видите в github.com для пакета узла, может не npm.org кодом, который вы устанавливаете с npm.org реестра npm.org !
  • 0
    Хотя теоретически хорошо созданный пакет узлов будет успешно установлен в ~/bin , некоторые пакеты узлов (или их зависимые пакеты) были протестированы только как устанавливаемые с помощью sudo поэтому имейте в виду, что вы можете столкнуться с непроверенной проблемой «среды установки». Как и любая другая проблема среды (например, смена ОС), принцип «напиши один раз, повсюду тестируй» остается в силе.
Показать ещё 1 комментарий
13

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

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

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

Что это.

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

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

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

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

sudo chown -R $USER /usr/local

EDIT:

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

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

  • 22
    Это плохая идея, потому что все / usr / local принадлежат одному пользователю.
  • 3
    Как отметил @ ReedG.Law, это действительно плохая идея. Не меняйте владельца / usr / local для какого-либо конкретного пользователя.
Показать ещё 9 комментариев
10

Проблема заключалась в том, что я установил node с помощью sudo, чтобы избежать ошибок при установке модулей npm во всем мире. MUST NEVER install node с sudo.

Моим решением было переустановить node так:

Загрузите последние стабильные источники node из 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 -R $USER/usr/local

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

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

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

npm install -g bower

npm install -g grunt

npm install -g yo

npm install -g generator- angular

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

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

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

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

2

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

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

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

sudo chown -R `whoami` ~/.npm
  • 0
    На самом деле это не сработало, поскольку я объяснил на шаге 3 то, что я пытался сделать, когда я не мог заставить его работать, проблема заключалась в том, что я установил узел с помощью sudo, что может при некоторых обстоятельствах создавать проблемы. Как только я удалил узел и переустановил его из его источников, все стало работать как положено!
  • 0
    @HeberLZ Я думаю, что вы правы, я просто пытался сделать это на другой машине вчера вечером, и она не работала. У меня были и другие проблемы с разрешениями. Все еще не уверен, что это лучший способ не запускать эту установку npm из исходного кода.
Показать ещё 4 комментария
1

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

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

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

0

Найдите путь к каталогу 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

0

используя lubuntu 14.04.3, я попытался изменить право собственности на .npm и префикс npm, обновил мой путь, npm установил модули в мой домашний каталог без sudo, но путь был неправильным, поэтому модули, подобные ember, не были найдены, linuxbew решила проблему, руководство по быстрой настройке здесь для node/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.

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

В любом случае, я бы рекомендовал https://stackoverflow.com/questions/16151018/npm-throws-error-without-sudo

-1

Лучшим решением, которое я нашел, было установить 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"

Примечание: ВСЕ ВЫШЕУПРАВЛЯЕМЫЕ КОМАНДЫ БУДУТ РАБОТАТЬ КАК ПОЛЬЗОВАТЕЛЯ. НЕ ИСПОЛЬЗУЙТЕ СЛЕДУЮЩИЙ ИЛИ КОРНЕВЫЙ ВХОД

НИКОГДА НИКОГДА НЕ ИЗМЕНЯТЬ РАЗРЕШЕНИЕ ПАПКИ ПОД /USR/LIB/ '. ВЕРНУТЬСЯ В ОСНОВАННУЮ ОС OS

-2

Я нахожу объяснения Pawel Grzybek очень убедительные: они сводятся к 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню