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, 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! Система 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! errno 3

    npm ERR! Помилка стека: EACCES, symlink '../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 та його генератори без судо, щоб потім не виникнути проблем :(


Дякую Філу, зараз це виглядає набагато краще
HeberLZ

2
Якщо ви хочете npm для встановлення глобальних пакетів у $ HOME, а не / usr, дотримуйтесь посібника github.com/sindresorhus/guides/blob/master/…
Полковник Паніка

це те, що працювало для мене github.com/nodejs/node-v0.x-archive/isissue/… :ln -s /usr/bin/nodejs /usr/bin/node
Loïc MICHEL

Можливий дублікат npm кидків помилка без судо
Луї

Відповіді:


318

Ubuntu 12.04 і використання PPA Кріса Лі для встановлення наступних робіт для мене:

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

і додавання $ HOME / .npm-пакетів / бін до $ PATH

додавати до .bashrc

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

дивіться https://stackoverflow.com/a/18277225 від @passy


9
Це виглядає як набагато більш чисте рішення. Якщо вам не подобаються системні папки у вашому домашньому каталозі, ви також можете використовувати таке місце, як ~ / .local / share / npm.
JeroenHoek

Слід зазначити, що після зміни префікса слід перевстановити всі встановлені раніше глобальні модулі, включаючи сам npm.
Дзямід

Це здається прекрасним, але мені було набагато простіше дати дозвіл користувачеві писати /usr/lib/node_modules/. Або, можливо, навіть доречно створити групу nodejs unix і надати цій групі дозвіл на запис у цей каталог.
mehulkar

Ще однією невеликою деталлю є те, що вам потрібно зробити каталог ~ / npm самостійно. В іншому випадку npm вийде з ENOENT помилками.
Джейсон Фарнсворт

6
Чому це не за замовчуванням для npm? Дякую, що поділились.
Доріан

23

Якщо у вас вже є $HOME/binваш шлях, більш просте рішення - це просто ...

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

Оскільки ця дискусія дійсно стосується зниження ризиків безпеки запуску sudo, ви також повинні знати, що будь-яка програма вузла потенційно може встановлювати ім’я програми, яке не відповідає зареєстрованому імені пакета вузла, який ви вважаєте, що встановлюєте. Отже, існує ризик безпеки, що npm installзаміна замінить існуючу системну команду або ту, яку ви вже маєте $HOME/bin. Якщо вас турбує, спочатку перевірте властивості binта scriptsвластивості у package.jsonфайлі програми, яку ви встановлюєте.

Загалом, найбезпечніше:

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

Довідка:


1
Ще одна важлива проблема безпеки npmполягає в тому, що вихідний код, який ви бачите на github.comрепо для пакету вузлів, може бути не тим самим кодом, який ви встановлюєте з npm.orgсервера реєстру!
Тоні О'Гаган

Хоча теоретично добре складений пакет вузлів із задоволенням встановиться ~/bin, деякі пакети вузлів (або їх залежні пакети) пройшли перевірку лише як встановлення, sudoмайте на увазі, що ви можете зіткнутися з неперевіреною проблемою "середовища встановлення". Як і будь-яка інша проблема оточення (як, наприклад, зміна ОС), принцип "пиши один раз, перевіряй скрізь" все ще діє.
Тоні О’Хаган

Недоліком цього методу є npm створює додатковий каталог, який називається ~ / lib. Залежно від практики організації, це може бути небажаним.
Містер S

12

Щодо жовтня 2014 року:

Node.js доступний з NodeSource Debian і Ubuntu довічного розподіл сховища .

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

Це воно.

Застаріла відповідь:

Найшвидший спосіб без використання судо подібний описаному тут isaac

Я настійно рекомендую вам не займатися управлінням пакунками з судо! Пакети можуть виконувати довільні сценарії, що робить налагодження команди менеджера пакунків безпечною, як стрижка бензопили. Звичайно, це швидко і обов'язково подолає будь-які перешкоди, але ви, можливо, хочете, щоб ця перешкода залишилася там.

Я рекомендую зробити це замість цього одного разу:

sudo chown -R $USER /usr/local

Редагувати:

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

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


23
Це погана ідея, оскільки змушує всі / usr / local належати одному користувачеві.
Закон Рід Г.

4
Як зазначав @ ReedG.Law, це дійсно погана ідея. Не змінюйте hte права власності на / usr / local на будь-якого конкретного користувача.
Крістофер буде

3
Я маю згоду з Законом Ріда G - зміна / usr / local - це ідея BAD BAD BAD. У моєму випадку я дивився на вказівки і робив це так: потім згадував, що я повинен ДІЯТИ це з іншою людиною, яка займається розробкою. Я повернувся назад і (сподіваюся) отримав усі зміни. Це не лише безпека, а й функціональність.
Ллойд Сарджент

3
Чи є якісь недоліки цього рішення, якщо в системі є лише один користувач ?
connorbode

2
Вибачте, /usr/local/lib/node_modulesnode
маю на

11

Проблема полягала в тому, що я встановив вузол за допомогою sudo , щоб уникнути помилок при встановленні npm-модулів у глобальному масштабі.

Моє рішення було перевстановити вузол таким чином:

Завантажте останні джерела стабільного вузла з nodejs.org #in my case node-v0.10.20.tar.gz

tar -zxf node-v0.10.20.tar.gz #uncompress джерела

папка cd node-v0.10.20 #enter нестиснута

sudo chown -R $ USER / usr / local

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

Варто зазначити, що тільки отримання права власності на / usr / local папку не працювало б у моєму випадку, оскільки сама установка вузла була зроблена з sudo

Останній крок для встановлення yeoman: #although на yeoman.io говорить, що при виконанні "npm install -g yo" вже встановлено bower і grunt, є деякі підмодулі grunt, які виходять з ладу, тому я вирішив, що встановивши його сам

npm встановити -g bower

npm встановити -g grunt

npm встановити -g yo

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


Теоретично чудово, але чи можна досягти такого ж ефекту, не змушуючи будувати Node та встановлювати 4 додаткові модулі просто для того, щоб мати доступ до модулів у всьому світі?
Дан Ніссенбаум

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

5

Я вирішив цю проблему із змінною середовища та псевдонімом оболонки:

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

Для мене npm не вшанував налаштування "префікса" в .npmrc.


2

Відповідно до цього подібного допису: npm кидає помилку без sudo

Схоже, у вас може виникнути проблема з власністю ~/.npm каталогом.

Як і відповідь у тому, спробуйте:

sudo chown -R `whoami` ~/.npm

Насправді це не спрацювало, як я пояснив на кроці 3 того, що я намагався, коли я не міг змусити його працювати, проблема полягала в тому, що я встановив вузол за допомогою sudo, який може за певних обставин створити проблеми. Як тільки я видалив вузол і перевстановив його зі своїх джерел, все почало працювати так, як очікувалося!
HeberLZ

@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" і "bower install" без судо! Працювали чудово!


0

використовуючи lubuntu 14.04.3, я спробував змінити право власності на префікс .npm та npm, оновив свій шлях, встановив npm модулі до моєї домашньої директорії без sudo, але шлях був неправильним, тому такі модулі, як ембер не знайдено, 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, ви зможете динамічно переходити між різними версіями вузлів, і він встановлюється локально для вашого користувача. Судо не потрібно. Просто переконайтеся, що ви попередньо повністю очистили старий вузол.

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'

Примітка: ВСІ З НАДІЗНИХ КОМАНДІВ МОЖУТЬ РАБИТИ ЯК КОРИСТУВАЧ. НЕ ВИКОРИСТОВУЙТЕ ВХІД СУДО АБО СКОРОЧНЕ

НІКОЛИ НЕ ЗМІНУВАТИ ДОЗВІЛЬНІСТЬ папок під '/ USR / LIB /'. ВІДБУДУЄТЬСЯ ДО НЕСТАВНОЇ ОС


1
Скопійовано з tnovelli.net/blog/blog.2011-08-27.node-npm-user-install.html без атрибуції.
Тобу

-2

Я вважаю пояснення Павла Гжибека дуже переконливими: вони зводяться до трьох простих команд 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.