Установка Npm завершилась неудачно с «невозможно запустить в wd»

153

Я пытаюсь настроить среду моего узла на новом экземпляре Ubuntu 12.04 с уже установленным Node 0.8.14, но у меня возникли проблемы при попытке запустить npm install. Поэтому, когда я пытаюсь npm install, он говорит, что мне нужно запустить его от имени пользователя root или администратора:

Error: EACCES, mkdir '/usr/local/lib/node_modules/coffee-script'
npm ERR!  { [Error: EACCES, mkdir '/usr/local/lib/node_modules/coffee-script']
npm ERR!   errno: 3,
npm ERR!   code: 'EACCES',
npm ERR!   path: '/usr/local/lib/node_modules/coffee-script',
npm ERR!   fstream_type: 'Directory',
npm ERR!   fstream_path: '/usr/local/lib/node_modules/coffee-script',
npm ERR!   fstream_class: 'DirWriter',
npm ERR!   fstream_stack: 
npm ERR!    [ 'DirWriter._create                 (/usr/local/lib/node_modules/npm/node_modules/fstream/lib/dir-writer.js:36:23)',
npm ERR!      '/usr/local/lib/node_modules/npm/node_modules/mkdirp/index.js:37:53',
npm ERR!      'Object.oncomplete (fs.js:297:15)' ] }
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.

Но когда вы пытаетесь запустить его как sudo, он говорит следующее:

npm WARN cannot run in wd PackNodeDev@0.0.1-166 npm install -g coffee-script node-gyp (wd=/home/ubuntu/PackNode)

В моем package.json он содержит следующие скрипты:

"scripts": {
    "preinstall": "npm install -g coffee-script node-gyp",
    "start": "node server.js",
    "test": "mocha --require should --compilers coffee:coffee-script --colors"
 },

Остальные зависимости действительны, так как я установил их прямо на своем компьютере (Mac). Кто-нибудь знает, почему это происходит?

EH
источник

Ответы:

231

В документации сказано (также здесь ):

Если npm был вызван с правами суперпользователя, он изменит uid на учетную запись пользователя или uid, указанный в userконфигурации, по умолчанию nobody. Установите unsafe-permфлаг для запуска сценариев с привилегиями root.

Ваши варианты:

  1. Запустите npm installс --unsafe-permфлагом:

    [sudo] npm install --unsafe-perm
  2. Добавьте unsafe-permфлаг к вашему package.json:

    "config": {
        "unsafe-perm":true
    }
  3. Не используйте preinstallскрипт для установки глобальных модулей, устанавливайте их отдельно, а затем запускайте обычный npm installбез прав root:

    sudo npm install -g coffee-script node-gyp
    npm install

Связанные :

Дмитрий Пашкевич
источник
2
Извините, я не видел этого до сих пор. Я пробовал «небезопасную пермь» раньше, но она тоже не сработала. Проблема все еще существует
EH
10
Это работает для меня: sudo npm install --unsafe-permоднако sudo npm installнет, хотя я добавил "unsafe-perm":trueв package.json ... Не знаю почему
Дмитрий Пашкевич
8
Добавление его к свойству «config» в package.json фактически устанавливает «npm_package_config_unsafe_perm», поэтому опция 2 не работает. Смотрите: stackoverflow.com/questions/28763958/…
justmoon
'unsafe-perm': для меня тоже не получилось. Жаль, что это не дало ошибку и контекст (включая изменение uid) в сообщении об ошибке, вместо того, чтобы вывести причину из существования и дать что-то загадочное, удивительное и враждебное.
android.weasel
Хотя npm install --unsafe-permу меня работает, я пытался понять, что нужно изменить userконфигурацию по умолчанию . Так что я сделал npm set user my_userи npm set group my_group, что добавляет соответствующие записи в корневом каталоге пользователя .npmrcфайл. Но проблема в том, что сама node_modulesпапка и ее подпапки все еще принадлежат пользователю root, так что это не помогает. Я не мог понять, каким образом они не будут принадлежать root.
Фулв
53

Единственное, что сработало для меня, это добавление .npmrcфайла, содержащего:

unsafe-perm = true

Добавление той же конфигурации, чтобы package.jsonне иметь никакого эффекта.

Undistraction
источник
36
в докере:RUN npm set unsafe-perm true
Александр Миллс
если вы используете WSL, просто наберите unsafe-perm true. В этом вам поможет
Стас Панюков
26

Я столкнулся с той же проблемой, когда пытался опубликовать свое приложение nodejs на частном сервере, на котором запущены CentO, используя пользователя root. Эта же ошибка вызывается командой «postinstall»: «./node_modules/bower/bin/bower install» в моем файле package.json, поэтому единственное решение, которое работает для меня, - это использовать обе опции, чтобы избежать ошибки:

1: использовать параметр --allow-root для команды установки bower

"postinstall": "./node_modules/bower/bin/bower --allow-root install"

2: использовать параметр --unsafe-perm для команды npm install

npm install --unsafe-perm
Ясин Хачлек
источник
12

OP здесь, я узнал намного больше об узле, так как я впервые задал этот вопрос. Хотя ответ Дмитрия был очень полезным, в конечном итоге он сделал для меня установку узла с правильными разрешениями.

Я настоятельно рекомендую не устанавливать узел с помощью каких-либо менеджеров пакетов, а собирать его самостоятельно, чтобы он находился в локальном каталоге с обычными разрешениями.

Эта статья содержит очень четкую пошаговую инструкцию, как это сделать:

https://www.digitalocean.com/community/tutorials/how-to-install-an-upstream-version-of-node-js-on-ubuntu-12-04

EH
источник
2

Я исправил это, изменив владельца /usr/localи ~/Users/user-nameвот так:

sudo chown -R my_name /usr/local

Это позволило мне сделать все без sudo

Даниэль О'Лири
источник