NPM nie instaluje zależności modułów

151

To jest moje package.jsondla modułu, który dołączam do projektu nadrzędnego:

{
  "version": "0.0.1",
  "name": "module-name",
  "dependencies": {
    "express": "3.3.4",
    "grunt": "0.4.1",
    "grunt-contrib-compass": "0.4.0",
    "grunt-contrib-copy": "0.4.1",
    "grunt-contrib-cssmin": "0.4.1",
    "grunt-contrib-jshint": "0.6.3",
    "grunt-contrib-requirejs": "0.4.1",
    "grunt-contrib-uglify": "0.2.2",
    "grunt-contrib-watch": "0.5.1",
    "grunt-express-server": "0.4.1",
    "grunt-karma": "0.4.5",
    "grunt-regex-replace": "0.2.5",
    "request": "2.25.0"
  },
  "scripts": {
    "postinstall": "grunt install"
  }
}

Należy zwrócić uwagę na to, że ten moduł jest zawarty w prywatnym repozytorium i dołączam go do elementu nadrzędnego, na package.jsonprzykład:"module-name": "git+ssh://git@myserver:user/module-name.git"

Ahmed Nuaman
źródło
Twój plik package.json wygląda dobrze, podobnie jak wiersz, którego używasz do jego dołączenia. Czy otrzymujesz komunikat o błędzie? Czy git na twojej drodze?
poida,
1
Nie dostaję żadnego błędu na sa, moduł instaluje się, ale mój postinstallskrypt nie działa, ponieważ gruntnie znaleziono pakietów lokalnych, ponieważ nie są one instalowane przez NPM
Ahmed Nuaman
1
Ten problem nadal istnieje w listopadzie 2016. Wykonałem czystą instalację działającego modułu na nowym komputerze. @ Odpowiedź Mohsena naprawiła problem.
Joe Lapp

Odpowiedzi:

152

Wygląda na to, że trafiłeś na błąd, który istnieje od dłuższego czasu i nie ma jeszcze rozwiązania. W repozytorium npm istnieje kilka otwartych problemów dotyczących tego przypadku:

W pierwszej z nich wymieniono kilka obejść, które możesz wypróbować.

Alternatywnym rozwiązaniem może być (trochę hakerskie) jawne wyszczególnienie zależności jako zależności pierwszego poziomu. Wymaga to utrzymania listy, ale praktycznie musi to być wykonywane bardzo rzadko.

allprog
źródło
1
@ Flame2057 dobrze jest wiedzieć, że nie masz szczęścia, ale nie jest to zbyt pouczające. Możesz śmiało sformułować pytanie, miejmy nadzieję, że społeczność ma wiedzę do rozwiązania. Baw się dobrze!
allprog
Potrzebowałem jednego dodatkowego kroku. Musiałem kliknąć prawym przyciskiem myszy „Zależności” w moim projekcie i wybrać „Przywróć pakiety” po wykonaniu innych wymienionych tutaj kroków (usuń node_modules i package.lock.json, a następnie zainstaluj npm).
Taersious
113

Miałem bardzo podobny problem, usunięcie całego node_modulesfolderu i ponowna instalacja działało dla mnie. Nauczyłem się tej sztuczki z programu IT Crowd !

rm -rf node_modules
npm install
Mohsen
źródło
To faktycznie zadziałało dla mnie. Myślę, że to naprawdę dziwne - co powoduje tę usterkę? Niezależnie od tego, jeśli usunę folder i ponownie uruchomię instalację npm, to działa. Wcześniej nic nie instalowało się w tym podkatalogu. Teraz wszystko jest tam instalowane.
CtheGood
Dzięki @Moshen. Usunąłem starą wersję Node i wykonałem czystą instalację. Usunąłem wszystkie moje node_modules / globalnie, ale zapomniałem usunąć je z niektórych istniejących aplikacji. Musiałem usunąć folder node_modules w katalogu każdej istniejącej aplikacji, a następnie uruchomić npm install.
wilblack
Stare, dobre „czy próbowałeś rozpocząć od nowa ?”. To działało świetnie dla mnie.
Marco Aurélio Deleu
Chociaż miło jest wiedzieć, że istnieje obejście, to naprawdę trąci „uruchom ponownie komputer i spróbuj ponownie” i po prostu ukrywa prawdziwy problem. Mam podobny problem z instalacją NPM (proces kończy się natychmiast bez komunikatu) i jednym z obejść jest usunięcie folderu node_modules i ponowna instalacja; co nie napawa mnie pewnością, że rozumiemy, co się tutaj dzieje.
Kelly S. French
1
To zadziałało dla mnie. Gdybym mógł dać +1 dla referencji IT Crowd, zrobiłbym to.
texelate
32

Używam komputera z systemem Windows.

  1. Usunąłem folder node_modules.
  2. W jakiś sposób tworzony jest plik package.lock.json. Usunąłem ten plik.
  3. Następnie zainstaluj npm.
  4. Czysta kompilacja.
  5. Biegać.
Virat18
źródło
14
Ta odpowiedź wymaga więcej miłości. Plik package.lock.json wkurzał mnie.
mwilcox
16

jeśli odziedziczyłeś ten kod, możliwe, że zależności i wersje zostały zablokowane i masz plik ./npm-shrinkwrap.json.

jeśli twoja zależność nie jest wymieniona w tym pliku, nigdy nie zostanie zainstalowana za pomocą npm installpolecenia.

trzeba będzie ręcznie zainstalować pakiety, a następnie uruchomić npm shrinkwrapaktualizację pliku powłoki.

Rico Rodriquez Collins
źródło
2
Wystąpił problem polegający na tym, że podczas ręcznej instalacji pakietu utworzono package-lock.jsonplik po aktualizacji do węzła 8.0.0 i npm 5.0.0. Po tym, uruchomienie npm installzainstalowałoby tylko ten jeden pakiet, a nie wszystkie z moich zależności. Usunięcie package-lock.jsoni ponowne uruchomienie npm installrozwiązało problem.
Monkpit
1
@Monkpit To również rozwiązało problem dla mnie, dzięki! package-lock.jsonprzeszkadzał.
VirtualWolf
10

Podejrzewam, że masz do czynienia z problemem polegającym na tym, że package.jsonplik nie znajduje się w tym samym katalogu co plik Gruntfile.js. Po uruchomieniu grunt xxxpoleceń pojawia się komunikat o błędzie, taki jak:

Local Npm module "xxx" not found. Is it installed?

Na razie rozwiązaniem jest:

  • Utwórz plik package.json w tym samym katalogu, co Gruntfile.js
  • Zdefiniuj moduły wymagane przez Twój gruntowny projekt
  • Wykonaj, npm installaby załadować je lokalnie
  • Teraz wymagane polecenie gruntowania powinno działać.

IMHO, to smutne, że nie możemy załadować modułów rozpoznawania gruntów z modułu nadrzędnego npm (tj. Package.json w katalogu nadrzędnym w tym samym projekcie). Dyskusja tutaj wydaje się wskazywać, że zostało to zrobione, aby uniknąć ładowania modułów „globalnych”, ale myślę, że zamiast tego chcemy ładować moduły z „mojego projektu”.

kctang
źródło
Oto struktura mojego projektu nadrzędnego (to jest ten, który importuje projekt modułu podrzędnego): cl.ly/image/020E0b3I0t1A i struktura projektu modułu podrzędnego: cl.ly/image/2q0L3l1v0s40 ; widać, że oba zawierają Gruntfile.jsi oba zawierają package.jsonna tym samym poziomie.
Ahmed Nuaman
1
To nie jest problem grunt, jest to problem z npmnierekurencyjnym instalowaniem zależności w moim projekcie modułu podrzędnego.
Ahmed Nuaman
9

OP może być prawdą dla starszej wersji węzła. Jednak spotkałem się z tym samym również w przypadku węzła 4.4.1.

Bardzo dobrze może być powiązany z używaną wersją węzła. Spróbuj zaktualizować do najnowszej wersji. Niektóre zależności nie są ładowane przechodnie, jeśli są niezgodne z wersją węzła.

Znalazłem to, biegając npm update.

Po aktualizacji do najnowszej wersji (4.4 -> 5.9); to zostało naprawione.

Nrj
źródło
8

W moim przypadku pomogło to usunąć node_modulesi package-lock.json.

Następnie po prostu zainstaluj wszystko ponownie z npm install.

Lars Kliesing
źródło
8

Sprawdź również, czy nazwa Twojej paczki jest poprawnie akceptowana:

ŹLE:

{
    "name":"My Awesome Package"
}


POPRAWNY

{
    "name": "my-awesome-package-name"
}
Kajusz
źródło
1
Tak, miałem spację w nazwie i nie zostało poprawnie zainstalowane.
Ansjovis86
1
nie tylko ze względu na przestrzeń, ale także o '-', którego użył w nazwie, ja też napotkałem ten sam problem, wstaw - lub _ w nazwie, to zadziała.
molagbal
4

Być może będziesz musiał zainstalować grunt-cli, spróbuj tego przed wykonaniem instalacji npm:

sudo npm install -g grunt-cli

To naprawia błąd, który nie kończy się dla mnie, będziesz również potrzebować prawidłowego pliku grunt.

Źródło: https://stackoverflow.com/a/16456467/241294

poida
źródło
Co się stanie, gdy spróbujesz wykonać polecenie „chrząknięcie” w wierszu polecenia? Czy jest na twojej drodze? Masz rację, wygląda na to, że został zainstalowany z twojego pastebina. Czy zainstalowałeś go z sudo i -g?
poida,
To nie jest problem z chrząknięciem:~ ᐅ which grunt /opt/local/bin/grunt
Ahmed Nuaman
Również kiedy sklonuję samo repozytorium, zamiast przez NPM i uruchomię npm installi grunt installdziała dobrze. Problem polega na tym, że NPM nie wydaje się instalować zależności repozytorium, jak określono wpackage.json
Ahmed Nuaman
W którym katalogu szukasz zależności pakietów? Nie powinny znajdować się na najwyższym poziomie, ale pod: top-level-package / node_modules / nazwa-modułu / node_modules. Czy to możliwe, że grunt nie znajduje pliku gruntowego, ponieważ działa w niewłaściwym katalogu?
poida,
Nie jest to problem grunt, gdy instalujesz moduły za pomocą NPM, zwykle dostarcza podsumowanie na końcu wszelkich zależności tego modułu, które zostały już zainstalowane; kiedy instaluję dany moduł, nie otrzymuję podsumowania żadnych zainstalowanych modułów zależności.
Ahmed Nuaman
4

Na wypadek, gdyby ktoś cierpiał z powodu tej kłopotliwej sytuacji i popełnił ten sam asaninowy błąd, co ja, oto co było w moim przypadku. Po godzinie uderzania głową o ścianę zdałem sobie sprawę, że mój json został nieprawidłowo zagnieżdżony, a kluczowe „zależności” znajdowały się w „repozytorium” klucza.
Nie trzeba dodawać, że nie było oczywistych błędów i nie zainstalowano żadnych modułów.

dgo
źródło
3

Innym sposobem obejścia tego problemu jest dodanie tego do package.jsonsekcji skryptów modułu

"preinstall": "npm install {Packages You depend on}"

co to zrobi, to zainstaluje wszystkie pakiety potrzebne modułowi i nie otrzymasz tego błędu.

Ahmed Fathy
źródło
3

dzieje się ze starą wersją węzła. użyj najnowszej wersji węzła w ten sposób:

$ nvm use 8.0
$ rm -rf node_modules
$ npm install
$ npm i somemodule

edytuj: również upewnij się save.
na przykład:npm install yourmoduleName --save

Deke
źródło
2

Otrzymałem ten błąd, gdy zainstalowałem czyste środowisko programistyczne Node w systemie Windows.

Aby to naprawić, wszedłem do mojego nowego katalogu projektu (z którym właśnie zbudowałem szkielet yo angular) i wpisałem dwa polecenia:

npm install -g grunt --save-dev

Spowoduje to zainstalowanie lokalnych zależności gruntowych w projekcie. Kolejny:

npm install

Zapewni to zainstalowanie wszystkich (nowych) zależności projektu.

Tada!

Jesse Lawson
źródło
2

Warto o tym wspomnieć, aby upewnić się, że twoje zależności powinny znajdować się w dependenciesczęści twojego package.json(a nie do devDependencies).

Mój problem był w zasadzie taki sam jak OP:

  • instalacja repozytorium prywatnego (nazwijmy to repo1) przez "module-name": "git+ssh://git@myserver:user/my-repo-name.git"inne repozytorium (nazwijmy to repo2),
  • in repo2's node_modules, nie było jednej zależności od pakietu repo1.
  • Mój głupi błąd! .. repo1polegał na wpisaniu tej zależności devDependencieszamiastdependencies
  • Przesuń zależność w moim repo1„s package.jsonod devDependencies dodependencies
  • W moim repo2, usunąłem moją node_modulesi package-lock.json, zrobiłem npm install, voilà! ... zależność była tam!
cafesanu
źródło
Zadeklarowałem zmienną środowiskową NODE_ENV = Production w moim pliku Dockerfile powyżej polecenia instalacji npm, co powoduje, że devDependencies nie są instalowane
Pieter De Clercq
0

Miałem ten sam problem. Ale na tym samym komputerze jeden projekt miał dobry plik package.json, w którym wszystkie moje zależności zostały pomyślnie zainstalowane. A w innym projekcie moje zależności package.json nie zostały zainstalowane bez względu na to, co robię. Po prostu skopiowałem plik package.json i wkleiłem go do innego projektu. I zadziałało! Różnica, którą znalazłem, to tylko pusty wiersz na początku pliku. Nie wiem lub na cokolwiek wpływa, może na jakiś inny problem. Ale problemem był tylko plik package.json.

mansim
źródło
0

Myślę, że też napotkałem ten problem i najlepszym rozwiązaniem, jakie znalazłem, było przyjrzenie się mojej konsoli i ustalenie wyrzucanego błędu. Przeczytałem więc uważnie i stwierdziłem, że problem polegał na tym, że nie podałem mojego repozytorium, opisu i prawidłowej nazwy w pliku package.json. Dodałem te informacje i wszystko było w porządku.

WinnersProx
źródło