Jak zastąpić zagnieżdżone wersje zależności NPM?

290

Chciałbym użyć grunt-contrib-jasminepakietu NPM. Ma różne zależności. Część wykresu zależności wygląda następująco:

─┬ grunt-contrib-jasmine@0.4.1
  ├─┬ grunt-lib-phantomjs@0.2.0
   ├─┬ phantomjs@1.8.2-2

Niestety w tej wersji jest błąd, phantomjsktóry uniemożliwia poprawną instalację w systemie Mac OS X. Zostało to naprawione w najnowszej wersji.

Jak mogę grunt-lib-phantomjsużyć nowszej wersji phantomjs?

Dodatkowy kontekst:

georgebrock
źródło
git cloneWymagany moduł Just lub Fork. Możesz także usunąć zagnieżdżone phantomjsręcznie.
Aleksei Zabrodskii
3
grunt-contrib-jasminejest na wersji 0.5.1, która używa [email protected], która używa [email protected]:)
gustavohenke

Odpowiedzi:

238

Możesz użyć funkcji npm shrinkwrap , aby zastąpić dowolną zależność lub zależność zależną.

Właśnie to zrobiłem w naszym chrapliwym projekcie. Potrzebowaliśmy nowszej wersji Connect, od wersji 2.7.3. sprawiał nam kłopoty. Więc stworzyłem plik o nazwie npm-shrinkwrap.json:

{
  "dependencies": {
    "grunt-contrib-connect": {
      "version": "0.3.0",
      "from": "[email protected]",
      "dependencies": {
        "connect": {
          "version": "2.8.1",
          "from": "connect@~2.7.3"
        }
      }
    }
  }
}

npm powinien automatycznie odebrać go podczas instalacji dla projektu.

(Widzieć: https://nodejs.org/en/blog/npm/managing-node-js-dependencies-with-shrinkwrap/ )

tuxpiper
źródło
7
Gdy to robię, grunt-contrib-connectinstalowana jest tylko zależność i jej dzieci. Wszystkie moje inne zależności w pakiecie.json nie są zainstalowane.
iDVB
5
Miałem ten sam problem co @iDVB. Skończyłem edytowanie node_moduleskatalogu, tak aby zrzut zrzutu zależności był dokładnie tym, czego chciałem, a nie tylko przesłonięciem. Ale wciąż rodzaj bolesnego rozwiązania.
Kobold
2
@Domi ten plik jest tworzony przez uruchomienie npm shrinkwrap, wpisy nie są dodawane ręcznie
glasspill
13
Niestety, jak wspomniano w tym błędzie, w przypadku npm4 minimalistyczne podejście już nie działa. (Podczas usuwania node_modules, uruchomienie instalacji z minimalnym zmniejszeniem zawartości wydaje się pozostać devDependenciesnietknięte, ale ignoruje dependencies, ale uruchomienie innej instalacji usuwa nieprecyzyjne elementy, więc na razie ważne jest, aby uruchomić, npm shrinkwrapaby uzyskać pełny plik, zmodyfikować odpowiednią część i potem biegnij npm installjeszcze raz)
Brett Zamir
6
npm 6.4 po prostu nadpisze plik
shrinkwrap
84

Dla tych od 2018 roku i później, używając npm wersji 5 lub nowszej: edytuj package-lock.json: usuń bibliotekę z"requires" sekcji i dodaj ją w „zależnościach”.

Na przykład chcesz, aby deglobpakiet używał globwersji pakietu 3.2.11zamiast bieżącej. Otwierasz package-lock.jsoni widzisz:

"deglob": {
  "version": "2.1.0",
  "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz",
  "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=",
  "requires": {
    "find-root": "1.1.0",
    "glob": "7.1.2",
    "ignore": "3.3.5",
    "pkg-config": "1.1.1",
    "run-parallel": "1.1.6",
    "uniq": "1.0.1"
  }
},

Usuń "glob": "7.1.2",z "requires", dodaj "dependencies"z odpowiednią wersją:

"deglob": {
  "version": "2.1.0",
  "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz",
  "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=",
  "requires": {
    "find-root": "1.1.0",
    "ignore": "3.3.5",
    "pkg-config": "1.1.1",
    "run-parallel": "1.1.6",
    "uniq": "1.0.1"
  },
  "dependencies": {
    "glob": {
      "version": "3.2.11"
    }
  }
},

Teraz usuń node_modulesfolder, uruchom, npm installa doda brakujące części do "dependencies"sekcji.

izogfif
źródło
4
To jest miłe, pod warunkiem, że npm installdziała raz. W moim przypadku zmiany są konieczne, ponieważ zagnieżdżony dep powoduje awarię.
ppasler
59
zostanie to usunięte za każdym razem, gdy uruchomisz npm izamiast edycji pliku package-lock.json i dodania zależności podrzędnej do „zależności” tam, dodaj zależność podrzędną do sekcji „zależności” pakietu.json
trickpatty
6
Stworzyłem bibliotekę, która robi to automatycznie dla ciebie: github.com/rogeriochaves/npm-force-resolutions
Rogerio Chaves
14
Działa, ale jeśli uruchomię npm installponownie, wszystkie zmiany package-lock.jsonzostaną przywrócone i otrzymam złą wersję dep.
2rs2ts
14
Biegnę npm cii to nie dotykaćpackage-lock.json
sschoof
0

Miałem problem polegający na tym, że jedna z zagnieżdżonych zależności miała lukę w kontroli audytu npm, ale nadal chciałem zachować wersję zależności nadrzędnej. rozwiązanie Shrinkwrap npm nie działało dla mnie, więc co zrobiłem, aby zastąpić zagnieżdżoną wersję zależności:

  1. Usuń zagnieżdżoną zależność w sekcji „wymagania” w pliku package-lock.json
  2. Dodaj zaktualizowaną zależność w polu DevDependencies w pliku package.json, aby moduły, które tego wymagają, nadal będą mogły uzyskać do niej dostęp.
  3. npm i
Ethan Yang
źródło
-1

Shrinkwrap NPM oferuje dobre rozwiązanie tego problemu. Pozwala nam to zastąpić tę wersję określonej zależności określonego podmodułu.

Zasadniczo, po uruchomieniu instalacji npm, npm najpierw sprawdzi w twoim katalogu głównym, czy istnieje plik npm-shrinkwrap.json. Jeśli tak, najpierw wykorzysta to do określenia zależności pakietu, a następnie powróci do normalnego procesu pracy z plikami package.json.

Aby utworzyć plik npm-shrinkwrap.json, wszystko, co musisz zrobić, to

 npm shrinkwrap --dev

kod:

{
  "dependencies": {
    "grunt-contrib-connect": {
      "version": "0.3.0",
      "from": "[email protected]",
      "dependencies": {
        "connect": {
          "version": "2.8.1",
          "from": "connect@~2.7.3"
        }
      }
    }
  }
}
Murtaza Hussain
źródło
3
Czy różni się to od obecnie akceptowanej odpowiedzi? Ta odpowiedź ma dwa pozytywne komentarze sugerujące, że nowsze wersje npm albo wymagają dodatkowych ręcznych kroków, albo robią niepożądane rzeczy z tym rozwiązaniem. Czy tak nie jest?
Fabio Beltramini,
-1

Znalazłem rozwiązanie, które działało dla mnie.

Więc. Najpierw edytuj plik npm-shrinkwrap.json zgodnie z zaleceniami dla wszystkich innych rozwiązań.

Następnie (w systemie Windows):

  • Kliknij prawym przyciskiem myszy plik „npm-shrinkwrap.json”
  • Nieruchomości
  • W sekcji Atrybuty wybierz opcję „Tylko do odczytu”. Uniemożliwi to npm zmodyfikowanie pliku mpn-shrinkwrap.json.

Inne proponowane rozwiązania są wystarczająco dobre, jeśli wykonujesz operację instalacji npm tylko raz. Ale po pierwszej „instalacji npm” plik „npm-shrinkwrap.json” jest ponownie modyfikowany, tak jak przed modyfikacją.

Szlomo Sfez
źródło
-1: wymagałoby to ponownego odblokowania pliku za każdym razem, gdy chcesz wprowadzić zmiany. W takich przypadkach i tak stracisz ręczne zmiany w pliku shrinkwrap. Dodatkowo każdy, kto współpracuje z twoim kodem, musi również włączyć ten hack.
thomaux