NPM kann keine Abhängigkeiten installieren - Versuchen Sie, etwas zu entsperren, das nicht gesperrt wurde

192

Ich habe versucht, eine npm-Installation für meine package.json-Datei auszuführen, aber ich habe große Probleme. Es wird immer wieder "Fehler: Versuch, XXX zu entsperren, das nicht gesperrt wurde" für alle meine Abhängigkeiten angezeigt. Hier ist einer von ihnen:

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)

Wenn ich versuche, es als sudo auszuführen, scheint es weiter zu gehen und einige Pakete zu installieren, aber stattdessen erscheinen einige neue Fehler:

> 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'

Ich habe kürzlich meine Knoten- und npm-Installationen aktualisiert. Vielleicht hat das etwas damit zu tun. Außerdem war der größte Teil meiner Entwicklung im Büro und heute arbeite ich über VPN. Vielleicht hat das auch etwas damit zu tun.

Irgendwelche Ideen?

TJ Kirchner
quelle
Hier ist die Datei package.json, wenn das hilft ... (seufz), nvm, ich kann sie scheinbar nicht einfügen ... zu viele Zeichen.
TJ Kirchner
welches Betriebssystem ausgeführt werden Sie
wayne

Antworten:

421

Laut photusenigma unter: https://github.com/npm/npm/issues/4815

Führen Sie diese Befehle in einem Terminalfenster aus (Hinweis - Ersetzen Sie NICHT den $ USER-Teil ... das ist ein Linux-Befehl, um Ihren Benutzer zu erreichen!):

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

... und ... wenn Sie auf einem Mac arbeiten (wie ich) und nach dem Ausführen dieser Befehle immer noch Fehler auftreten, führen Sie diesen letzten aus, und Sie sollten gut sein. (Empfehlen Sie, dass Sie versuchen, es zu testen, bevor Sie dies tun. Ich mag es nicht, die Berechtigungen für das GESAMTE Verzeichnis / usr / local zu ändern, es sei denn, es scheint wirklich notwendig zu sein!)

sudo chown -R $USER /usr/local
alexoviedo999
quelle
7
Arbeitete für mich danke! Mein Ordner node_modules befand sich jedoch an einer anderen Stelle. Vielleicht hilft dies jemand anderemsudo chown -R `whoami` /usr/lib/node_modules/
Justen,
4
Seltsamerweise hat rekursiv chowndie Berechtigungen ~/.npm/_locksfür mich nicht geändert . Ich habe meine zum Laufen gebrachtsudo chown -R myname ~/.npm/_locks
Sitati
7
Beachten Sie, dass diese Lösung für Mehrbenutzerplattformen nicht geeignet ist. Der erste Befehl ist in Ordnung, der zweite macht einen Standardbenutzer zum Eigentümer von Systemdateien. / usr / local / lib / node_modules wird nur von npm mit der Option --global verwendet, dh auch mit sudo. Leider mischen einige Installationsskripte, die npm verwenden, sowohl globale als auch nicht globale npm-Befehle ... Erstellen dieses Chaos.
Fafaman
5
Einverstanden, alles was Sie brauchen ist der erste Befehl. Vermeiden Sie die anderen, da diese Ihrem Benutzer eigentlich nicht gehören sollten.
Pyrospade
2
Gibt es eine Möglichkeit, die "Effekte" der zweiten Zeile umzukehren sudo chown -R $USER /usr/local/lib/node_modules? Ich habe es ausgeführt, bevor ich gelesen habe, dass es keine gute Idee ist.
shaneparsons
153

Ich habe heute Nachmittag mit einem Kollegen zusammengearbeitet und herausgefunden, wo das Problem liegt. Mein Ordner ".npm" in meinem Home-Verzeichnis gehörte dem Root-Benutzer anstelle von mir. Ich bin mir nicht sicher, was das verursacht hat. Vielleicht habe ich an einem Punkt Node oder npm als Root-Administrator installiert. Auf jeden Fall bin ich gerade gelaufen sudo chown -R [username] .npmund konnte endlich wieder npm installBefehle aus meinen Projekten ausführen!

TJ Kirchner
quelle
11
Es ist auch hilfreich, wenn Sie denselben Befehl auch an einem ~/tmp/beliebigen Ort ausführen oder an einem beliebigen Ort, den Node als temporären Ort verwendet
Jason
1
Vielen Dank für Ihre Antwort! Hat mir Kopfschmerzen erspart, da die Fehlermeldung schlecht ist. Aber ich werde sagen, dass npm dies standardmäßig tun muss, da ich mir ziemlich sicher bin, dass ich es nicht selbst unter root installiert habe. Und der Vollständigkeit halber müssen Sie -R <Benutzername> .npm
Crowmagnumb
Ich bin froh, dass ich helfen konnte :) Und, guter Fang! Ich werde meine Antwort ändern, um das zu sagen.
TJ Kirchner
Lebensretter! Vielen Dank
Matthew Cullum
21

In meinem Fall wurde npm mit einem Benutzer aufgerufen, der kein HOME-Verzeichnis hat. Daher würde beispielsweise der folgende Befehl fehlschlagen:

sudo -u someUser npm install

Die Lösung besteht darin, ein HOME-Verzeichnis bereitzustellen, in someUserdas Schreibzugriff besteht:

sudo -u someUser HOME=/some/directory npm install
Bjarke Walling
quelle
Upvoted, weil das für mich tatsächlich funktioniert hat, also ein großes Lob und vielen Dank. Ich stelle für die Produktion bereit und der Benutzer hatte nicht einmal ein .npm-Verzeichnis (das ich sowieso finden konnte)
Stuart Watt
Funktioniert unter ChromeOS mit dem Benutzer "chronos".
Kyle Coberly
Ich konnte dies umgehen sudo -u someUser -i, indem ich spezifizierte , wodurch eine neue Login-Shell gestartet wird. Ich habe mich etwas genauer damit befasst und der Caching-Code in npm verwendet die Variable npm.cache, die ich standardmäßig vermute $HOME/.npm/. sudo kann sich je nach Konfiguration und Vorhandensein oder Fehlen von Befehlszeilenoptionen auch unterschiedlich verhalten, wenn die HOME-Variable eingestellt wird.
Jgibson
11

Hatte das gleiche Problem und behebt es durch Ändern der Persistenten gemäß der akzeptierten Antwort:

sudo chown -R $USER ~/.npm

Der zweite Befehl sollte jedoch vermieden werden, da er die Berechtigungen einer Systemressource herabsetzt ( sudo chown -R $USER /usr/local/lib/node_modules). Keine gute Idee.

Für die Aufzeichnung: "usr" in /usr/localsteht für Unix System Resources .

chris
quelle
1
Dies sollte wahrscheinlich ein Kommentar zur akzeptierten Antwort sein und nicht als neue Antwort veröffentlicht werden.
Kmeixner
Der Autor dieser Antwort weiß dies, hat seine Antwort jedoch nicht aktualisiert. Ich sage daher, dass eine separate Antwort sehr gerechtfertigt ist.
Gui Prá
4

Nichts davon hat bei mir funktioniert. Ich musste buchstäblich als root laufen, indem ich Folgendes tat:

sudo su -
sudo npm install forever -g

Dann das unter Linux Ubuntu 14.04 installierte Paket.

gelegentlich
quelle
Sie sollten npm wirklich nicht als root ausführen!
Antoine 'hashar' Musso
1

Meine Lösung:

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

in meinem Fall war:

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

Aber ich bekam endlich das gleiche Problem

npm cache clean

es funktionierte !

Mayo
quelle
0

Ich hatte das gleiche Problem und versuchte stundenlang, die Berechtigung / den Besitz von npm-bezogenen Dateien und Verzeichnissen zu beheben , , hatte aber kein Glück damit.

Plötzlich stellte ich fest, dass ich eine ~/.npmrcDatei mit einem cacheEintrag hatte, der auf ein nicht vorhandenes Verzeichnis zeigte. Diese cacheEigenschaft wurde entfernt, um den Standard-Cache-Speicherort zu verwenden, und jetzt ist sie behoben.

Cheolgook
quelle
0

Haftungsausschluss

Ich bin ein Windows- Benutzer. Mein Team und ich sind jedoch auf eine Reihe von Problemen bezüglich npm-Installationsfehlern gestoßen.

Probleme

Das Folgende ist eine Liste der gewonnenen Erkenntnisse und eine mögliche radikale Lösung, die uns immer gerettet hat:

  1. node_modules , das lokale Installationsverzeichnis von npm wird durch einen Mangel des Betriebssystems vor Änderungen geschützt, z. B. durch die Unfähigkeit, Pfade mit mehr als 255 Zeichen zu verarbeiten.
  2. Wenn der Ordner mithilfe eines Befehlszeilentools gelöscht wird, sieht es möglicherweise immer noch so aus, als ob der Ordner im Explorer vorhanden ist, und beim Versuch, darauf zuzugreifen, werden einige Berechtigungsfehler angezeigt.
  3. Abhängig von Ihrem Antiviren- und / oder lokalen Richtlinienmanager können Sie möglicherweise den Ordner node_modules erstellen und später den Zugriff oder die Berechtigungen darauf ablehnen , was zu einer Reihe von Installationsfehlern führt.
  4. Aktivieren Sie npm-Protokolle, um weitere Einblicke in mögliche Probleme zu erhalten mit:

    npm install --loglevel verbose

Radikale

Installieren Sie rimraf global

 npm install rimraf -g

Führen Sie rimraf auf node_modules aus :

rimraf yourDir/node_modules

Versuchen Sie dann zu laufen:

npm install

Warnung!

Oder dort fehlt. Seien Sie äußerst vorsichtig, was dem Befehl folgt rimraf. Es gibt keine Warnungen, keine Eingabeaufforderungen, es gibt nichts. Es löscht einfach das Verzeichnis aus der Phase der Erdreinigung, als wäre es nie da. Versuchen Sie es auf eigenes Risiko.

Wilmer Saint
quelle