NPM не может установить зависимости - попытка разблокировать то, что не было заблокировано

192

Я пытался запустить установку npm для моего файла package.json, но у меня много проблем. Он продолжает говорить «Ошибка: попытка разблокировать XXX, который не был заблокирован» на всех моих зависимостях. Вот один из них:

Error: Attempt to unlock tbd@~0.6.4, which hasn't been locked
        at unlock (/usr/local/lib/node_modules/npm/lib/cache.js:1304:11)
        at cb (/usr/local/lib/node_modules/npm/lib/cache.js:646:5)
        at /usr/local/lib/node_modules/npm/lib/cache.js:655:20
        at /usr/local/lib/node_modules/npm/lib/cache.js:1290:7
        at /usr/local/lib/node_modules/npm/node_modules/lockfile/lockfile.js:167:38
        at OpenReq.Req.done (/usr/local/lib/node_modules/npm/node_modules/graceful-fs/graceful-fs.js:144:5)
        at OpenReq.done (/usr/local/lib/node_modules/npm/node_modules/graceful-fs/graceful-fs.js:64:22)
        at Object.oncomplete (fs.js:107:15)

Если я попытаюсь запустить его как sudo, кажется, что он идет дальше и начинает устанавливать некоторые пакеты, но вместо этого появляются новые ошибки:

> chokidar@0.8.1 postinstall /Users/tkirchner/Documents/Projects/mm-datatable/node_modules/karma/node_modules/chokidar
> node setup-deps.js

shell-init: error retrieving current directory: getcwd: cannot access parent directories: Permission denied

node.js:811
    var cwd = process.cwd();
                      ^
Error: EACCES, permission denied
    at Function.startup.resolveArgv0 (node.js:811:23)
    at startup (node.js:58:13)
    at node.js:902:3
npm ERR! error rolling back Error: ENOTEMPTY, rmdir '/Users/tkirchner/Documents/Projects/mm-datatable/node_modules/karma/node_modules/q'
npm ERR! error rolling back  karma@0.10.9 { [Error: ENOTEMPTY, rmdir '/Users/tkirchner/Documents/Projects/mm-datatable/node_modules/karma/node_modules/q']
npm ERR! error rolling back   errno: 53,
npm ERR! error rolling back   code: 'ENOTEMPTY',
npm ERR! error rolling back   path: '/Users/tkirchner/Documents/Projects/mm-datatable/node_modules/karma/node_modules/q' }
npm ERR! Error: ENOENT, chown '/Users/tkirchner/Documents/Projects/mm-datatable/node_modules/karma/node_modules/socket.io/lib/socket.io.js'

Я недавно обновил мой узел и установки npm. Так что, возможно, это как-то связано с этим. Кроме того, большая часть моей разработки была в офисе, и сегодня я работаю через VPN, так что, возможно, это тоже как-то связано с этим.

Любые идеи?

Ти Джей Киршнер
источник
Вот файл package.json, если это поможет ... (вздох) nvm, я не могу вставить его ... слишком много символов.
TJ Kirchner
какой ОС ты бежишь
Уэйн

Ответы:

421

В соответствии с фотографией по адресу: https://github.com/npm/npm/issues/4815

Запустите эти команды в окне терминала (обратите внимание - НЕ заменяйте часть $ USER ... это команда linux, чтобы получить вашего пользователя!):

sudo chown -R $USER ~/.npm
sudo chown -R $USER /usr/local/lib/node_modules

... и ... если вы на Mac (как и я) и по-прежнему видите ошибки после выполнения этих команд, то запустите эту последнюю, и у вас все будет хорошо. (Рекомендую вам попробовать выполнить тестирование до того, как вы это сделаете. Мне не нравится изменять разрешения для каталога ENTIRE / usr / local, если это действительно не кажется необходимым!)

sudo chown -R $USER /usr/local
alexoviedo999
источник
7
Работал на меня, спасибо! Моя папка node_modules была в другом месте, хотя, может быть, это поможет кому-то ещеsudo chown -R `whoami` /usr/lib/node_modules/
Justen
4
Странно, рекурсивный chownне изменил разрешения ~/.npm/_locksдля меня. Я получил свою работу, запустивsudo chown -R myname ~/.npm/_locks
Ситати
7
Имейте в виду, что это решение не подходит для многопользовательских платформ. Первая команда в порядке, вторая делает обычного пользователя владельцем системных файлов. / usr / local / lib / node_modules используется только npm с опцией --global, что означает также использование sudo. К сожалению, некоторые установочные скрипты, использующие npm, смешивают как глобальные, так и неглобальные команды npm ... Создание этого беспорядка.
Фафаман
5
Согласитесь, все, что вам нужно, это первая команда. Избегайте других, так как они действительно не должны принадлежать вашему пользователю.
пироспед
2
Есть ли способ отменить "эффекты" второй линии sudo chown -R $USER /usr/local/lib/node_modules? Я запустил его, прежде чем прочитать, что это не очень хорошая идея ..
shaneparsons
153

Я работал с коллегой сегодня днем ​​и выяснил, в чем проблема. Моя папка ".npm" в моем домашнем каталоге принадлежала пользователю root, а не мне. Я не уверен, что случилось с этим. Возможно, я однажды установил узел или npm в качестве администратора root. В любом случае, я просто побежал sudo chown -R [username] .npmи наконец смог снова запустить npm installкоманды из своих проектов!

Ти Джей Киршнер
источник
11
Это также помогает, если вы также выполняете ту же команду ~/tmp/или любое другое местоположение, которое Node использует в качестве временного местоположения
Jason
1
Спасибо за ваш ответ! Избавил меня от головной боли, так как сообщение об ошибке плохое. Но я скажу, что npm должен делать это по умолчанию, потому что я уверен, что сам не устанавливал его под root. И, для полноты, вы должны указать -R <имя пользователя> .npm
crowmagnumb
Рад, что смог помочь :) И, хороший улов! Я изменю свой ответ, чтобы сказать это.
Ти Джей Киршнер
Спасатель жизни! Спасибо
Мэтью Каллум
21

В моем случае проблема заключалась в том, чтобы вызвать npm с пользователем, у которого нет каталога HOME, поэтому, например, следующая команда не будет выполнена:

sudo -u someUser npm install

Решением является предоставление каталога HOME, в котором someUserесть доступ для записи:

sudo -u someUser HOME=/some/directory npm install
Бьярке Уоллинг
источник
Проголосовал, потому что это действительно сработало для меня, так что спасибо и спасибо. Я внедряю в производство, и у пользователя даже не было каталога .npm (который я мог найти в любом случае)
Стюарт Уотт
Работает на ChromeOS с пользователем "chronos".
Кайл Коберли
Я смог обойти это, указав sudo -u someUser -i, что запускает новую оболочку входа в систему. Я посмотрел на это еще немного, и код кэширования в npm использует переменную npm.cache, которую я предполагаю по умолчанию $HOME/.npm/. У sudo также может быть другое поведение в зависимости от того, какая переменная HOME установлена ​​в зависимости от конфигурации и наличия или отсутствия параметров командной строки.
Джибсон
11

Была та же проблема и исправлена, изменив разрешения согласно принятому ответу:

sudo chown -R $USER ~/.npm

Однако второй команды следует избегать, поскольку она снижает права системного ресурса ( sudo chown -R $USER /usr/local/lib/node_modules). Не хорошая идея.

Для справки: «usr» /usr/localозначает Unix System Resources .

Крис
источник
1
Вероятно, это должен быть комментарий к принятому ответу, а не публикация в качестве нового ответа.
Kmeixner
Автор этого ответа знает об этом, но не обновил свой ответ, поэтому я считаю, что отдельный ответ очень оправдан.
Ги Пра
4

Ничто из этого не сработало для меня. Мне пришлось запустить буквально как root, выполнив следующее:

sudo su -
sudo npm install forever -g

Затем пакет установлен на Linux Ubuntu 14.04.

occasl
источник
Вы действительно не должны запускать npm как root!
Антуан Хашар Муссо
2

Следующая команда должна исправить проблемы с разрешениями:

sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}

Вы можете прочитать о других официально рекомендованных решениях здесь:

https://docs.npmjs.com/getting-started/fixing-npm-permissions

Тим Уайт
источник
1

Мое решение:

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

в моем случае было:

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

Но я получил ту же проблему, наконец, после

npm cache clean

это сработало !

майонез
источник
0

У меня была та же проблема, и я часами пытался исправить разрешение / владение файлами и каталогами, относящимися к npm, но безуспешно .

Внезапно я обнаружил, что у меня есть ~/.npmrcфайл с cacheзаписью, указывающей на несуществующий каталог. Удалил это cacheсвойство, чтобы использовать расположение кеша по умолчанию, и теперь оно решено.

cheolgook
источник
0

отказ

Я пользователь Windows . Тем не менее, моя команда и я столкнулись с рядом проблем, связанных с ошибками установки npm.

Проблемы

Ниже приведен список извлеченных уроков и возможное радикальное решение, которое всегда нас спасало:

  1. node_modules , локальный каталог установки npm защищен от изменений из-за недостатка ОС, например невозможности обрабатывать пути длиннее 255 символов.
  2. Если папка удалена с помощью инструмента командной строки, она все равно может выглядеть так, как будто папка существует в проводнике, что при попытке доступа к ней выдает ряд ошибок разрешения.
  3. В зависимости от вашего антивируса и / или локального менеджера политик вы можете создать папку node_modules, а затем предоставить доступ или разрешения к ней, что приведет к ряду ошибок установки.
  4. Включите журналы npm, чтобы лучше понять возможные проблемы с:

    npm install --loglevel verbose

радикал

Установить Rimraf во всем мире

 npm install rimraf -g

Запустите rimraf для node_modules :

rimraf yourDir/node_modules

Затем попробуйте запустить:

npm install

Предупреждение!

Или ее отсутствие. Будьте предельно внимательны к тому, что следует за командой rimraf. Нет предупреждений, нет подсказок, нет ничего. Он просто стирает каталог с этапа очистки земли, как будто его там никогда не было. Попробуйте на свой страх и риск.

Wilmer Saint
источник