NPM nie może zainstalować zależności - Spróbuj odblokować coś, co nie zostało zablokowane

192

Próbowałem uruchomić instalację npm na moim pliku package.json, ale mam wiele problemów. Ciągle mówi „Błąd: próba odblokowania XXX, który nie został zablokowany” na wszystkich moich zależnościach. Oto jeden z nich:

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)

Jeśli spróbuję uruchomić go jako sudo, wydaje się, że idzie dalej i zaczynam instalować niektóre pakiety, ale zamiast tego pojawiają się nowe błędy:

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

Niedawno zaktualizowałem instalacje mojego węzła i npm. Może to ma z tym coś wspólnego. Poza tym większość moich prac rozwojowych odbywa się w biurze, a dziś pracuję przez VPN, więc może to ma coś wspólnego z tym.

Jakieś pomysły?

TJ Kirchner
źródło
Oto plik package.json, jeśli to pomaga ... (westchnienie), nvm, nie mogę go wkleić ... zbyt wiele znaków.
TJ Kirchner
po co biegasz
Wayne

Odpowiedzi:

421

Zgodnie z photusenigma na: https://github.com/npm/npm/issues/4815

Uruchom te polecenia w oknie terminala (uwaga - NIE zamieniaj części $ USER ... to jest polecenie linuksowe, aby uzyskać użytkownika!):

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

... i ... jeśli jesteś na komputerze Mac (tak jak ja) i nadal widzisz błędy po uruchomieniu tych poleceń, uruchom to ostatnie i powinieneś być dobry. (Polecam spróbować przetestować, zanim to zrobisz. Nie lubię zmieniać uprawnień do CAŁEGO katalogu / usr / local, chyba że naprawdę wydaje się to konieczne!)

sudo chown -R $USER /usr/local
alexoviedo999
źródło
7
Pracował dla mnie dzięki! Mój folder node_modules był w innym miejscu, może to pomoże komuś innemusudo chown -R `whoami` /usr/lib/node_modules/
Justen
4
O dziwo, rekurencyjne chownnie zmieniło ~/.npm/_locksdla mnie uprawnień . Mam swoją pracę, biegającsudo chown -R myname ~/.npm/_locks
Sitati
7
Należy pamiętać, że to rozwiązanie nie jest dobre dla platform dla wielu użytkowników. Pierwsze polecenie jest w porządku, drugie czyni standardowym właścicielem plików systemowych. / usr / local / lib / node_modules jest używany tylko przez npm z opcją --global, co oznacza także używanie sudo. Niestety niektóre skrypty instalacyjne używające npm mieszają zarówno globalne, jak i nieglobalne polecenia npm ... Tworzenie tego bałaganu.
Fafaman,
5
Uzgodnione, wszystko czego potrzebujesz to pierwsze polecenie. Unikaj innych, ponieważ naprawdę nie powinny one należeć do Twojego użytkownika.
pirospada
2
czy istnieje sposób na odwrócenie „efektów” drugiej linii sudo chown -R $USER /usr/local/lib/node_modules? Uruchomiłem go przed przeczytaniem, że to nie jest dobry pomysł ..
shaneparsons,
153

Po południu pracowałem ze współpracownikiem i zorientowałem się, na czym polega problem. Mój folder „.npm” w moim katalogu domowym był własnością użytkownika root, a nie mnie. Nie jestem pewien, co to spowodowało. Może w pewnym momencie zainstalowałem węzeł lub npm jako administrator root. W każdym razie właśnie uruchomiłem sudo chown -R [username] .npmi wreszcie mogłem ponownie uruchomić npm installpolecenia z moich projektów!

TJ Kirchner
źródło
11
Pomaga także, jeśli wykonasz to samo polecenie ~/tmp/lub w dowolnej lokalizacji, której węzeł używa jako lokalizacji tymczasowej
Jason
1
Dziękuję za Twoją odpowiedź! Zaoszczędził mi trochę bólu głowy, ponieważ komunikat błędu jest zły. Ale powiem, że npm musi to robić domyślnie, ponieważ jestem pewien, że sam nie zainstalowałem go jako root. I dla kompletności musisz odrzucić -R <nazwa_użytkownika>
.npm
Cieszę się, że mogłem pomóc :) I dobry chwyt! Zmodyfikuję swoją odpowiedź, aby to powiedzieć.
TJ Kirchner
Oszczędzanie życia! Dziękuję
Matthew Cullum
21

W moim przypadku problemem było wywołanie npm z użytkownikiem, który nie ma katalogu HOME, więc na przykład następująca komenda się nie powiedzie:

sudo -u someUser npm install

Rozwiązaniem jest zapewnienie katalogu HOME, w którym someUserma dostęp do zapisu:

sudo -u someUser HOME=/some/directory npm install
Bjarke Walling
źródło
Głosowałem, ponieważ to faktycznie działało dla mnie, więc podziękowania i podziękowania. Wdrażam się do produkcji, a użytkownik nawet nie miał katalogu .npm (który i tak mogłem znaleźć)
Stuart Watt
Działa w systemie ChromeOS z użytkownikiem „chronos”.
Kyle Coberly
Byłem w stanie obejść ten problem, określając sudo -u someUser -i, która uruchamia nową powłokę logowania. Przyjrzałem się temu trochę więcej, a kod buforujący w npm używa zmiennej npm.cache, którą domyślam się domyślnie $HOME/.npm/. sudo może również zachowywać się inaczej, zależnie od konfiguracji zmiennej HOME, w zależności od konfiguracji oraz obecności lub braku opcji wiersza poleceń.
jgibson
11

Miałem ten sam problem i naprawiłem go, zmieniając persmisje zgodnie z przyjętą odpowiedzią:

sudo chown -R $USER ~/.npm

Należy jednak unikać drugiego polecenia, ponieważ obniża ono uprawnienia zasobu systemowego ( sudo chown -R $USER /usr/local/lib/node_modules). To nie jest dobry pomysł.

Dla przypomnienia: „usr” /usr/localoznacza Unix System Resources .

Chris
źródło
1
Prawdopodobnie powinien to być komentarz do zaakceptowanej odpowiedzi, a nie opublikowany jako nowa odpowiedź.
Kmeixner
Autor tej odpowiedzi wie o tym, ale nie zaktualizował swojej odpowiedzi, więc mówię, że osobna jest bardzo uzasadniona.
Gui Prá
4

Nic z tego nie działało dla mnie. Musiałem uruchomić dosłownie jako root, wykonując następujące czynności:

sudo su -
sudo npm install forever -g

Następnie pakiet zainstalowany w systemie Linux Ubuntu 14.04.

okazyjnie
źródło
Naprawdę nie powinieneś uruchamiać npm jako root!
Antoine „hashar” Musso
2

Następujące polecenie powinno rozwiązać problemy z uprawnieniami:

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

O innych oficjalnie zalecanych rozwiązaniach możesz przeczytać tutaj:

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

Tim White
źródło
1

Moje rozwiązanie:

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

w moim przypadku było:

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

Ale w końcu miałem ten sam problem

npm cache clean

zadziałało !

majonez
źródło
0

Miałem ten sam problem i próbowałem naprawić uprawnienia / prawa własności do plików i katalogów związanych z npm przez wiele godzin, ale nie miałem z tym szczęścia.

Nagle okazało się, że mam ~/.npmrcplik z cachewpisem wskazującym na nieistniejący katalog. Usunięto tę cachewłaściwość, aby użyć domyślnej lokalizacji pamięci podręcznej, a teraz została rozwiązana.

cheolgook
źródło
0

Zrzeczenie się

Jestem użytkownikiem systemu Windows . Jednak mój zespół i ja natknęliśmy się na szereg problemów dotyczących błędów instalacji npm.

Problemy

Poniżej znajduje się lista wyciągniętych wniosków i możliwe radykalne rozwiązanie, które zawsze nas uratowało:

  1. node_modules , lokalny katalog instalacyjny npm zostaje zabezpieczony przed modyfikacją przez wadę systemu operacyjnego, taką jak niemożność przetworzenia ścieżek dłuższych niż 255 znaków.
  2. Jeśli folder zostanie usunięty za pomocą narzędzia wiersza polecenia, nadal może wyglądać, jakby folder istniał w eksploratorze, który podczas próby uzyskania dostępu powoduje szereg błędów uprawnień.
  3. W zależności od programu antywirusowego i / lub lokalnego menedżera zasad możesz utworzyć folder node_modules, a następnie przenieść go ponownie lub uprawnienia do niego, co spowoduje szereg błędów instalacji.
  4. Włącz dzienniki npm, aby uzyskać lepszy wgląd w możliwe problemy z:

    npm install --loglevel verbose

Rodnik

Zainstaluj rimraf na całym świecie

 npm install rimraf -g

Uruchom rimraf na module_węzła :

rimraf yourDir/node_modules

Następnie spróbuj uruchomić:

npm install

Ostrzeżenie!

Lub brak tam. Zachowaj szczególną ostrożność co do polecenia rimraf. Nie ma żadnych ostrzeżeń, żadnych podpowiedzi, nie ma nic. Po prostu usuwa katalog z fazy ziemi, tak jakby nigdy go nie było. Wypróbuj na własne ryzyko.

Wilmer Saint
źródło