Dlaczego instalacja npm mówi, że mam niespełnione zależności?

404

Mam pakiet węzłów. Kiedy biegnęnpm install z katalogu głównego pakietu, instaluje kilka rzeczy, ale następnie drukuje kilka komunikatów o błędach, które wyglądają tak:

npm WARN unmet dependence / Users / seanmackesey / google_drive / code / explore / generator / node_modules / findup-sync / node_modules / glob wymaga graceful-fs@'~1.2.0 ', ale załaduje się

Muszę się mylić, co dokładnie npm installrobi. Jeśli wykryje zależność, czy nie powinna go zainstalować? W jakich warunkach wyświetla mi się taki komunikat o błędzie i jak mogę rozwiązać zależności?

Sean Mackesey
źródło

Odpowiedzi:

397

Uważam, że dzieje się tak, ponieważ rozdzielczość zależności jest nieco zepsuta, patrz https://github.com/npm/npm/issues/1341#issuecomment-20634338

Oto możliwe rozwiązanie:

  1. Ręcznie zainstaluj moduły najwyższego poziomu, zawierające niezaspokojone zależności: npm install [email protected]

  2. Przebuduj swój pakiet.json. Umieść wszystkie moduły wysokiego poziomu (służy jako zależność dla innych modułów) na dole.

  3. Ponownie uruchom npm installpolecenie.

Problem może być spowodowany tym, że npm nie udało się pobrać całego pakietu z powodu przekroczenia limitu czasu lub coś innego.

Uwaga: Możesz również zainstalować uszkodzone pakiety ręcznie, używając npm install [email protected] .

Przed uruchomieniem npm installpomocne mogą być następujące kroki:

  • usuń node_modules za pomocą rm -rf node_modules/
  • biegać npm cache clean

Dlaczego czasami konieczne jest „usuwanie węzłów”? Jeśli podczas instalacji moduł zagnieżdżony nie zostanie zainstalowany npm install, kolejne npm installnie wykryją brakujących zagnieżdżonych zależności.

W takim przypadku czasami wystarczy usunąć zależność najwyższego poziomu brakujących modułów zagnieżdżonych i uruchomić npm installponownie. Widzieć

dule
źródło
22
Usunięcie modułów węzła i wyczyszczenie pamięci podręcznej sprawiło, że zadziałało to dla mnie.
MarkoHiel,
4
usunięcie „node_modules”, uruchomienie „npm cache clean”, a następnie uruchomienie „npm install” naprawiło mój problem. Musiałem uruchomić „npm_install” trzy razy, aż wszystkie zależności zostały załadowane bez błędów.
hendrix,
2
jeśli npm cache cleannie działa z powodów dostępu, spróbuj sudo npm cache clean.
Soroush
12
@Soroush na ślepo dodanie sudo do rzeczy, które nie działają poprawnie, nie naprawia ich magicznie, po prostu oznacza, że ​​nie wiesz, co się dzieje.
Edgar Aroutiounian
5
dlaczego kiedykolwiek inne „rozwiązanie” dla npm zawiera rm r node_modules? i dlaczego jest to tak naprawdę jedyna opcja w większości przypadków? nie tak myślę, że powinien działać menedżer pakietów
phil294
83

Zdarzyło mi się, gdy WIFI uległo awarii podczas npm install. Usunięcie node_modulesi ponowne uruchomienie npm installnaprawiło to.

geon
źródło
26
i spróbuj npm cache clean.
ijse
5
Ponowna instalacja węzła prawdopodobnie nie jest konieczna, ale między zrobieniem tego npm cache cleana usunięciem node_modulesta rada działała dla mnie.
RichLitt
@RichLitt, tak, robienie npm cache cleantego nie było dla mnie wystarczające, musiałem je również usunąć node_modules, aby działało po awarii sieci podczas instalacji.
Mark Tomlin,
Nie wiem, który node_moduleskatalog usunąć? Mam podobny problem z błędem/usr/local/lib/node_modules/npm/node_modules/read-installed/node_modules/readdir-scoped-modules requires graceful-fs@'^4.1.2'
wuliwong,
1
@wuliwong Najwyższy poziom.
geon
33

Rozwiązałem problem za pomocą tych wierszy poleceń

  • $ rm -rf node_modules/
  • $ sudo npm update -g npm
  • $ npm install

Zrobione!

zatamine
źródło
5
Po uruchomieniu sudo npm update -g npm, mój npm stał się bezużyteczny, każda próba zainstalowania czegokolwiek skutkuje „npm ERR! Nie mogę znaleźć modułu„ read-package-json ”” będę musiał to głosować
MichaelB
To zadziałało dla mnie i dla innych ludzi, może masz inny problem. Spróbuj zainstalować moduł read-package-json globalnie sudo npm install -g read-package-jsonLub zainstaluj ponownie npm
zatamine
8
zastrzeżenie: nie powinieneś używać sudo npm, sugeruje się zamiast tego zmianę uprawnień lub własności katalogu, który npm chce również napisać.
Sgnl
1
może też dodać tam „npm cache clean”
Alexander Mills,
1
Nie używaj sudoz npm
Grant
11

Uaktualnienie NPM do najnowszej wersji może w tym bardzo pomóc. Powyższa odpowiedź dule ma rację, mówiąc, że zarządzanie zależnościami jest nieco zepsute, ale wydaje się, że dotyczy to głównie starszych wersji npm.

Polecenie npm listwyświetla listę wszystkich zainstalowanych node_modules. Kiedy przeprowadziłem aktualizację z wersji 1.4.2 do wersji 2.7.4, wiele modułów, które były wcześniej oflagowane WARN unmet dependency, nie było już takich.

Aby zaktualizować npm, powinieneś wpisać npm install -g npmna MacOSX lub Linux. W systemie Windows stwierdziłem, że ponowne pobranie i ponowne uruchomienie instalatora nodejs było bardziej skutecznym sposobem aktualizacji npm.

Stephen
źródło
Miałem ten sam problem z wersją npm dystrybuowaną w repozytoriach CentOS 7. Zainstalowałem najnowszą wersję npm z node.js i problem zniknął, więc myślę, że masz rację, może to być problem ze starą wersją.
Elouan Keryell-Even
9

Powyższe odpowiedzi nie pomogły mi w pełni nawet po usunięciu node_moduleskatalogu.

Poniższe polecenie pomogło mi w końcu:

npm config set registry http://registry.npmjs.org/

Zauważ, że powoduje to przeciągnięcie modułów węzła przez niepewne połączenie HTTP.

Src: https://stackoverflow.com/a/13119867/4082503

Vinay Vemula
źródło
Pomogło mi to, podobnie jak mój host, przekierowywać ruch.
dimiguel
1
@dimgl miło wiedzieć :)
Vinay Vemula
1
@Dejel próbowałeś również innych odpowiedzi. Być może będziesz musiał uruchomić npm installwiele razy i / lub ręcznie zainstalować niektóre pakiety węzłów jeden po drugim.
Vinay Vemula,
4

Dla każdego -- UNMET PEER DEPENDENCY, np. -- UNMET PEER DEPENDENCY [email protected], zainstaluj tę zależność, npm install --save [email protected]dopóki nie będzie już więcejUNMET DEPENDENCIES .

Powodzenia.

Akash
źródło
1
Pozostawiają mi te same błędy, w tym nowy:ERR! code 1
Wouter Vanherck
1
@ WouterVanherck możesz spróbować rm -rf node_modules, a następnie npm cache cleani npm install. Jeśli nadal nie działa, proponuję, aby ponownie rm -rf node_modules, wtedy npm i -g yarni wtedy yarn install. Przędza jest dość dobra w zarządzaniu node_modules. Powodzenia.
Akash
1
Tak, po co peerDependenciesjest. Aby popchnąć Cię do świadomego wyboru wersji.
Kamafeather
3

Uruchomiłem npm listi zainstalowałem wszystkie pakiety wymienione jako NIEZALEŻNOŚĆ

Na przykład:

├── UNMET DEPENDENCY css-loader@^0.23.1
npm install css-loader@^0.23.1

achasinh
źródło
2

To rozwiązało dla mnie:

  1. Popraw numery wersji w package.jsonzależności od błędów;
  2. Usuń node_modules( rm -rf node_modules);
  3. Uruchom ponownie npm install.

Powtarzaj te kroki, aż nie będzie więcej błędów.

użytkownik1585939
źródło
1

Coś w podobnym stylu dodałbym jeszcze jeden krok.

Zauważ, że w wersji npm> 1.4.9, 'instalacja npm' instaluje devDependencies. Najpierw spróbuj usunąć istniejące moduły i pamięć podręczną:

remove node_modules $ rm -rf node_modules/
run $ npm cache clean

Więc spróbuj:

npm install --dev
npm update --dev

To przynajmniej rozwiąże rekurencyjne rozwiązywanie zależności.

nieznany z nazwiska
źródło
6
do czego służy flaga --dev?
Alexander Mills,
1

- dev instaluje rekursywnie devDependencies (i działa wiecznie ...) w jaki sposób może pomóc w rozwiązaniu różnic wersji?

Możesz spróbować usunąć folder node_moduls, następnie wyczyścić pamięć podręczną npm, a następnie ponownie uruchomić polecenie „npm i”

arielhad
źródło
1

Miałem podobny problem podczas instalowania React Native CLI. Nie byłem pewien, który /node_moduleskatalog powinienem usunąć po przeczytaniu tutaj odpowiedzi. W końcu po prostu uciekłem

npm update -g

i potem udało się zainstalować pakiet.

Wuliwong
źródło
1

Próbowałem pracować nad działającym automatycznym systemem wdrażania npm install, więc wiele z tych rozwiązań nie działałoby dla mnie w zautomatyzowanym systemie. Nie miałem możliwości usuwania / ponownego tworzenia, node_modules/ani nie mogłem łatwo zmienić wersji Node.js.

Skończyło się na tym, że uruchomiłem npm shrinkwrap- dodając npm-shrinkwrap.jsonplik do mojego pakietu wdrożeniowego i odtąd uruchamiając instalacje. To rozwiązało problem; z plikiem shrinkwrap jako „pomocnikiem”, npm wydaje się być w stanie znaleźć odpowiednie pakiety i zainstalować je dla mnie. (Shrinkwrap ma również inne funkcje, ale właśnie do tego potrzebowałem w tym konkretnym przypadku).

Uberbrady
źródło
1

Napotkałem ten problem podczas instalowania pakietów reagujących i działało to dla mnie: npm install --save <package causing this error>

korp
źródło
1

W moim przypadku aktualizacja npm rozwiązała to.

sudo npm install -g npm
Marcelo Gumiero
źródło
1

npm installzainstaluje wszystkie paczki z npm-shrinkwrap.json, ale może zignorować paczki package.json, jeśli nie są ustawione wcześniej.

Jeśli twój projekt ma npm-shrinkwrap.json, upewnij się, że uruchomiłeś npm shrinkwrapgo, aby go zregenerować, za każdym razem, gdy dodajesz dodaj / usuń / zmień package.json.

Marius
źródło
0

Aktualizacja do 4.0.0

Aktualizacja do 4 jest tak prosta, jak aktualizacja zależności Angular do najnowszej wersji i podwójne sprawdzenie, czy chcesz animacji. Będzie to działać w większości przypadków użycia.

W systemie Linux / Mac:

npm install @angular/{common,compiler,compiler-cli,core,forms,http,platform-browser,platform-browser-dynamic,platform-server,router,animations}@latest typescript@latest --save 

W systemie Windows:

npm install @angular/common@latest @angular/compiler@latest @angular/compiler-cli@latest @angular/core@latest @angular/forms@latest @angular/http@latest @angular/platform-browser@latest @angular/platform-browser-dynamic@latest @angular/platform-server@latest @angular/router@latest @angular/animations@latest typescript@latest --save

Następnie uruchom dowolne normalnie używane polecenie ng serw lub npm start i wszystko powinno działać.

Jeśli korzystasz z animacji, zaimportuj nowy BrowserAnimationsModulez @angular/platform-browser/animationskatalogu głównego NgModule. Bez tego kod zostanie skompilowany i uruchomiony, ale animacje spowodują błąd. Import z @angular/corebył przestarzały, użyj importu z nowego pakietu

import { trigger, state, style, transition, animate } from '@angular/animations';.
Aman Agnihotri
źródło