npm кидає помилку без sudo


1286

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

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 та встановленням вузла з 0official pkg intaller це рішення не працювало. Я використовував цей замість: stackoverflow.com/a/34968008/675565
fmquaglia

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

Відповіді:


2268

Це виглядає як проблема дозволів у вашому домашньому каталозі. Щоб відновити право власності на каталог .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
Ной

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

9
@ChristopherWill: Це не змінює право власності на системний каталог. Це змінює право власності на каталоги в домашній директорії користувача, якими повинен володіти користувач.
user4815162342

619

Права доступу ви використовували при установці вузол буде необхідний при виконанні таких речей , як писати у вашій НОЙ директорії ( npm link, npm install -gі т.д.).

Ви, ймовірно, запустили інсталяцію вузла з кореневими дозволами, тому глобальна установка пакету просить вас отримати root.


Рішення 1: NVM

Не зламайте дозволи, установіть вузол правильним способом.

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

NVM (Node Version Manager) дозволяє встановити Node без кореневих дозволів, а також дозволяє встановити безліч версій Node, щоб легко з ними грати. Ідеально підходить для розробки.

  1. Видаліть Вузол (ймовірно, буде потрібно дозвіл root). Це може вам допомогти.
  2. Потім встановіть NVM, дотримуючись інструкцій на цій сторінці .
  3. Встановити Вузол через NVM: nvm install node

Тепер npm link, npm install -gбільше не вимагатиме від вас root.

Редагувати: Див. Також 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
Фабіо Антунес

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

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

401

Також вам знадобиться дозвіл на запис у node_modulesкаталозі:

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

7
Як і ~/tmpкаталог для мене.
knownasilya

122
Я не знаю, чому це все ще отримує відгуки. Дуже погана практика змінювати право власності на системні каталоги на конкретного користувача! Будь ласка, дивіться відповідь нижче щодо інших рішень (наприклад, створення окремої групи для користувачів вузлів).
Крістофер Вілл

1
я не node_modulesв /usr/local/lib/. wtf?
Connor Leech

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

7
всі, будь ласка, спростуйте це ... Then I ran sudo chown -R $USER /* and everything was fine- НІ - ви робите свою машину.
commonpike

75

Зміна власника папок "system-global" - це хакер. Під час нової інсталяції я б налаштував NPM на використання вже записаного місця для програм "user-global":

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. Для багатьох користувачів, особливо якщо вони не мають root, вони є ~/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-Directory у вашому домашньому каталозі та вкаже npmна нього.

Щоб ці зміни були постійними, вам потрібно додати команду export до вашого .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
Це найкраща відповідь. Це рекомендований спосіб вирішити проблему.
Paulo Coghi - Відновити Моніку

Чому загроза безпеці є небезпекою?
Френк

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 роки я б рекомендував використовувати Менеджер версій версії . Це позбавить вас багато часу та клопоту.


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
Дякую, цей працював для мене, як не чудовий солюд. Ти врятував мене.
fmquaglia

я повинен перейти лише до варіанту 2, якщо я отримав / usr?
Альберт Лоре

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

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

Приємно, цей працював на мене. Дякую за пояснення, крім команд.
FrankByte.com

12

Наче тут нам потрібно більше відповідей, але все одно ..

У Sindre Sorus є посібник Встановлення пакетів npm у всьому світі без судових процесів на 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

Єдине рішення, яке працювало для мене, яке не передбачає зйомки з дозволами. Я ненавиджу НПМ та його ідіотські дурощі. Дякую за рішення!
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.


найкращий і простий виправлення
Manjeet Singh

6

У мене була аналогічна проблема в модулях NPM не буде встановлено глобально без sudo , проблема полягала в тому, що коли я встановив вузол, я зробив це з sudo через chris / lea ppa repo .

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

Завантажте останні джерела стабільного вузла з 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 $ USER -R / usr / local

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

ПД: Якщо ви не хочете змінювати право власності на / usr / local папку, ви можете встановити її десь у вас уже є. Проблема такого підходу полягає в тому, що вам доведеться зв’язати папку установки з командним рядком bash, щоб згодом ми могли використовувати команду node

mkdir ~ / опт

./configure --prefix = ~ / opt && make && make install

echo 'експортувати PATH = ~ / opt / bin: $ {PATH}' >> ~ / .bashrc #or ~ / .profile або ~ / .bash_profile або ~ / .zshenv залежно від поточної операційної системи

З будь-яким із цих підходів ви зможете зробити наступне, не використовуючи sudo

npm install -g module_to_install


1
Я закінчила цей метод. Використовували sudo chown $USER /use/localперед будівництвом. Поки добре виглядає, час спробувати створити атом! Дякую!
прасантв

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 total 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 npm
tkane2000

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 / node
    sudo chgrp nodegrp / usr / bin / npm
    sudo chown -R $ (whoami): nodegrp ~ / .npm


1
Мені довелося змінити пару шляхів до / usr / local / bin, але крім цього рішення це чудово працювало на моїй машині OX X 10.9 - дякую!
спліг

Погана практика змінити власність на системні каталоги.
багатий ремер

@richremer Я думаю, це залежить від того, чого ти намагаєшся досягти. якщо папка спочатку доступна лише судером, то її можна змінити лише таким чином. ми обмежуємо зміну папкою, що стосується npm. Чи було б безпечніше тримати sudoчи змінювати право власності на групи папок, щоб воно могло бути змінено звичайним користувачем? Якщо звичайний користувач не повинен виконувати жодної дії над цією папкою, то, звичайно, не слід змінювати групове право власності на папку.
кен

Відповідна річ - це встановити глобальні пакети з sudo, але робити це з -Hпрапором. В Зокрема, sudo -H npm install -g <pkg>. Це забезпечує належне розмежування дозволів для системних і користувальницьких папок. Те, що ви не хочете робити, - це використання sudo npm install -g, оскільки це встановлює файли, що належать кореням, у ваш каталог користувачів. Було б чудово, якби 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

І все працює чудово!


Ви дуже приголомшливий пане :)
user805981

Файли - /usr/libце системні файли і не повинні належати вашому особистому обліковому запису користувача.
багатий ремер

4

ПИТАННЯ : Ви (користувач) не маєте правильного набору дозволів для каталогу.

Миттєвий вихід - запустити npm install за допомогою 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. Відкрийте Finder і натисніть 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_модулі встановлені за замовчуванням шляхом запуску npm config get prefix. Якщо ви отримаєте, як я роблю на Trusty,/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 та перейдіть до властивостей
  • Перейдіть на вкладку Безпека та розширено
  • Угорі ви побачите "Власник: СИСТЕМА", натисніть кнопку Змінити
  • Введіть користувача, для якого потрібно отримати дозволи та натисніть кнопку Ок
  • Поставте прапорець внизу розширених налаштувань "Замінити всі записи дозволу на об'єкт дочірніми на спадкові записи дозволів від цього об'єкта" та натисніть кнопку ОК
  • Робіть необхідну установку / оновлення 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
Süther

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's 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 та node знали, де встановити та знайти пакунки
  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.