Модули NPM не будут установлены глобально без sudo
Я только что переустановил Ubuntu 12.04 LTS, и прежде всего я сделал эти шаги:
Установил узел через менеджер пакетов со следующим скриптом
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
Попытался установить генераторы yeoman, express, n, yeoman по всему миру, и все они вернули ту же ошибку
нпм ERR! Ошибка: EACCES, символическая ссылка '../lib/node_modules/n/bin/n'
нпм ERR! { [Ошибка: EACCES, символическая ссылка '../lib/node_modules/n/bin/n'] errno: 3, код: 'EACCES', путь: '../lib/node_modules/n/bin/n' }
нпм ERR!
нпм ERR! Пожалуйста, попробуйте запустить эту команду снова как root/Administrator.
нпм ERR! Система Linux 3.8.0-29-универсальная
нпм ERR! команда "/usr/bin/node" "/usr/bin/npm" "install" "-g" "-d" "n"
нпм ERR! cwd /home/heberlz
нпм ERR! узел -v v0.10.20
нпм ERR! npm -v 1.3.11
нпм ERR! путь../lib/node_modules/n/bin/n
нпм ERR! код EACCES
нпм ERR! errno 3
нпм ERR! Ошибка стека: EACCES, символическая ссылка '../lib/node_modules/n/bin/n'
нпм ERR!
нпм ERR! Дополнительные подробности регистрации можно найти в:
нпм ERR! /home/heberlz/npm-debug.log
нпм ERR! не в порядке код 0
Рекурсивно вернул себе право собственности на следующие папки ~/.npm, /usr/lib/node, /usr/lib/node_modules и следующие символические ссылки /usr/bin/node, /usr/bin/nodejs, но безуспешно
Мне нужно установить Yeoman и его генераторы без sudo, чтобы потом не было проблем:(
17 ответов
Ubuntu 12.04 и использование PPA Криса Ли для установки следующих работ для меня:
npm config set prefix '~/.npm-packages'
и добавление $HOME/.npm-packages/bin в $PATH
добавить в .bashrc
export PATH="$PATH:$HOME/.npm-packages/bin"
см. /questions/12391030/npm-yeoman-ustanovit-generator-uglovoj-bez-sudo/12391040#12391040 от @passy
Если у вас уже есть $HOME/bin
на вашем пути, простое решение просто...
npm config set prefix ~
- Новые команды узла теперь будут установлены в вашем
$HOME/bin
каталог. - Не нужно менять свой путь!
Так как это обсуждение действительно о снижении рисков безопасности работы sudo
Вы также должны знать, что любое приложение узла может потенциально устанавливать имя приложения, которое не совпадает с именем зарегистрированного пакета узла, которое, по вашему мнению, вы устанавливаете. Таким образом, существует риск безопасности, что npm install
заменит существующую системную команду или команду, которая у вас уже есть $HOME/bin
, Если вы обеспокоены, проверьте bin
, а также scripts
свойства в package.json
файл приложения, которое вы устанавливаете первым.
В общем, безопаснее всего:
- (место
$HOME/bin
последний на вашем пути, поэтому системные команды не заменяются. - (б) не включать "." или любой относительный путь в вашем
$PATH
так что вы случайно не запускаете команду, которая находится в текущем каталоге.
Ссылка:
- свойства package.json
- установка npm
- Уязвимости безопасности в NodeJS: https://nodesecurity.io/.
По состоянию на октябрь 2014 года:
Node.js доступен в репозитории двоичных дистрибутивов Debian и Ubuntu для NodeSource.
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 для текущего пользователя:
- если на машине есть другой пользователь, который может использовать глобальные пакеты npm - не меняйте владельца / usr / local
- https://apple.stackexchange.com/questions/1393/are-my-permissions-for-usr-local-correct
- https://askubuntu.com/questions/261326/is-it-safe-to-chown-usr-local
Сказав это, если вы хотите установить глобальный модуль без использования sudo, я не вижу лучшего решения (с прагматической точки зрения), чем упомянуто. Безопасность и простота использования - это очень широкая тема, и на нее нет простого ответа - она зависит только от ваших требований.
Проблема заключалась в том, что я установил узел с помощью sudo, чтобы избежать ошибок при глобальной установке модулей npm, один НЕ ДОЛЖЕН устанавливать узел с помощью sudo.
Моим решением было переустановить узел таким образом:
Загрузите последние стабильные исходные узлы с сайта 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, поскольку сама установка узла была выполнена с помощью sudo
Последний шаг для установки yeoman: #although at yeoman.io говорит, что выполнение "npm install -g yo" уже устанавливает bower и grunt, есть некоторые подмодули grunt, которые не работают, поэтому я исправил это, установив его сам
npm установить -g bower
npm install -g grunt
npm install -g yo
npm install -g generator-angular
Я решил эту проблему с переменной среды и псевдонимом оболочки:
export NPM_PREFIX=$HOME/node
alias npmg="npm -g --prefix $NPM_PREFIX"
Для меня npm не соблюдает параметр конфигурации "prefix" в.npmrc.
Найдите путь к каталогу 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
Согласно этому аналогичному сообщению SO: npm выдает ошибку без sudo
Похоже, у вас может быть проблема с ~/.npm
каталог.
Как и в ответе, попробуйте:
sudo chown -R `whoami` ~/.npm
На самом деле, я просто изменил разрешение для пользовательской папки, которой владел root:
sudo chown -R $USER ~/.config/configstore
Тогда я мог бы "установить npm" и "установить bower" без sudo! Работал нормально!
Если вы работаете на машине для разработки, возможно, вам стоит подумать об использовании nvm.
Если нет, вы просто хотите установить, используя ваш любимый менеджер пакетов.
В любом случае, я бы порекомендовал проверить этот ответ на stackru
Проблема связана с другим владельцем папок npm. Лучший способ решить эту проблему с разрешениями, выполнив команду ниже:
sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
Это изменяет права доступа к подпапкам, используемым npm.
Чтобы установить Node.js и npm локально без использования sudo, откройте терминал и введите:
echo 'export PATH=$HOME/local/bin:$PATH' >> ~/.bashrc
. ~/.bashrc
mkdir ~/local
mkdir ~/node-latest-install
cd ~/node-latest-install
wget -c http://nodejs.org/dist/node-latest.tar.gz | tar xz --strip-components=1
./configure --prefix=~/local
make install
wget -c https://www.npmjs.org/install.sh | sh
Эта и другие проблемы, вызванные одной и той же причиной, могут быть решены установкой 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.
Использовать энергонезависимую память
У меня была такая же проблема с отказом в доступе. Вместо того, чтобы пытаться исправить NodeJS, установленный с https://nodejs.org/en/ , который устанавливается в папки, принадлежащиеroot
вместо$USER
, я использовал NVM. диспетчер версий узлов.
- Установите его: запустите
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
- Установите версию узла: запустите
nvm install 16
- Используй это:
-
nvm use 16
-
npm install -g yarn
-
Все работало нормально, когда я использовал Node, установленный NVM.
Используя lubuntu 14.04.3, я попытался сменить владельца префикса.npm и npm, обновил мой путь, npm установил модули в мой домашний каталог без sudo, но путь был неправильным, поэтому модули типа ember не были найдены, linuxbew быстро решил проблему Руководство по установке здесь для узла /npm
Просто используйте nvm, вы сможете динамически переключаться между различными версиями узла, и он устанавливается локально для вашего пользователя. Sudo не требуется. Просто убедитесь, что вы полностью очистили старый узел заранее.
Я нахожу объяснения Павла Грзибека очень убедительными: они сводятся к трем простым командам 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
Лучшее решение, которое я нашел, было установить 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'
Примечание: ВСЕ ВЫШЕУКАЗАННЫЕ КОМАНДЫ БУДУТ РАБОТАТЬ КАК ПОЛЬЗОВАТЕЛЬ НЕ ИСПОЛЬЗУЙТЕ SUDO ИЛИ ROOT LOGIN
НИКОГДА НЕ ИЗМЕНЯЙТЕ РАЗРЕШЕНИЕ ПАПКИ ПОД /USR/LIB/. ПРИВЕДЕТ К НЕУСТОЙЧИВОМ ОС