Wie überschreibe ich verschachtelte NPM-Abhängigkeitsversionen?


290

Ich möchte das grunt-contrib-jasmineNPM-Paket verwenden. Es hat verschiedene Abhängigkeiten. Ein Teil des Abhängigkeitsdiagramms sieht folgendermaßen aus:

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

Leider gibt es in dieser Version einen Fehler, phantomjsder die korrekte Installation unter Mac OS X verhindert. Dies ist in der neuesten Version behoben.

Wie kann ich grunt-lib-phantomjseine neuere Version von verwenden phantomjs?

Ein zusätzlicher Kontext:


Nur git cloneoder Gabel benötigt Modul. Sie können verschachtelte phantomjsDateien auch manuell entfernen .
Aleksei Zabrodskii

3
grunt-contrib-jasmineist auf 0.5.1, die verwendet grunt-lib-phantomjs@0.3.1, die verwendet phantomjs@1.9.1-0:)
gustavohenke

Antworten:


238

Sie können die npm-Shrinkwrap- Funktion verwenden, um Abhängigkeiten oder Unterabhängigkeiten zu überschreiben.

Ich habe das gerade in einem Grunzprojekt von uns gemacht. Wir brauchten eine neuere Version von connect seit 2.7.3. hat uns Ärger gemacht. Also habe ich eine Datei mit dem Namen npm-shrinkwrap.json erstellt:

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

npm sollte es während der Installation für das Projekt automatisch abholen.

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


7
Wenn ich das mache, werden nur die grunt-contrib-connectAbhängigkeit und ihre untergeordneten Elemente installiert. Alle meine anderen Abhängigkeiten in package.json sind nicht installiert.
IDVB

5
Ich hatte das gleiche Problem wie @iDVB. node_modulesAm Ende habe ich das Verzeichnis so bearbeitet , dass der vollständige Shrinkwrap-Abhängigkeits-Dump genau das war, was ich wollte, und nicht nur Überschreibungen. Aber immer noch eine Art schmerzhafte Lösung.
Kobold

2
@Domi diese Datei wird durch Ausführen von npm shrinkwrap erstellt, die Einträge werden nicht von Hand hinzugefügt
glasspill

13
Wie in diesem Fehler erwähnt, funktioniert der minimalistische Ansatz mit npm4 leider nicht mehr. (Beim Löschen node_modulesscheint das Ausführen einer Installation mit einem minimalen Shrinkwrap devDependenciesintakt zu bleiben, obwohl es ignoriert dependencieswird. Wenn Sie jedoch eine andere Installation ausführen, werden die nicht expliziten Elemente entfernt. Daher ist es vorerst wichtig npm shrinkwrap, eine vollständige Datei abzurufen, den betreffenden Teil zu ändern und dann npm installwieder laufen )
Brett Zamir

6
npm 6.4 wird nur die Shrinkwrap-Datei überschreiben und die veralteten Abhängigkeiten verwenden
ShadSterling

83

Für Benutzer ab 2018, die npm Version 5 oder höher verwenden: Bearbeiten Sie Ihre package-lock.json: Entfernen Sie die Bibliothek aus dem "requires"Abschnitt und fügen Sie sie unter "Abhängigkeiten" hinzu.

Sie möchten beispielsweise, dass das deglobPaket die globPaketversion 3.2.11anstelle der aktuellen verwendet. Sie öffnen package-lock.jsonund sehen:

"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"
  }
},

Entfernen Sie "glob": "7.1.2",aus "requires", fügen Sie "dependencies"mit der richtigen Version:

"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"
    }
  }
},

Entfernen Sie nun Ihren node_modulesOrdner, führen Sie ihn aus npm installund es werden fehlende Teile zum "dependencies"Abschnitt hinzugefügt .


4
Das ist schön, solange es einmal npm installläuft. In meinem Fall sind die Änderungen erforderlich, da die verschachtelte Dep einen Fehler verursacht.
ppasler

59
Dies wird npm ijedes Mal entfernt, wenn Sie ausführen, anstatt Ihre package-lock.json zu bearbeiten und die untergeordnete Abhängigkeit zu "Abhängigkeiten" hinzuzufügen. Fügen Sie die untergeordnete Abhängigkeit zu Ihrem package.json-Abschnitt "Abhängigkeiten" hinzu
trickpatty

6
Ich habe eine Bibliothek erstellt, die genau das automatisch für Sie erledigt: github.com/rogeriochaves/npm-force-resolutions
Rogerio Chaves

14
Es funktioniert aber wenn ich npm installdann package-lock.jsonwieder starte dann werden alle Änderungen rückgängig gemacht und ich bekomme die schlechte Version der Dep zurück.
2rs2ts

14
Ich npm cipackage-lock.json
renne


0

Ich hatte ein Problem, bei dem eine der verschachtelten Abhängigkeiten eine Sicherheitsanfälligkeit bezüglich der npm-Prüfung aufwies, aber ich wollte trotzdem die übergeordnete Abhängigkeitsversion beibehalten. Die Shrinkwrap-Lösung von npm hat bei mir nicht funktioniert. Was ich also getan habe, um die verschachtelte Abhängigkeitsversion zu überschreiben:

  1. Entfernen Sie die verschachtelte Abhängigkeit im Abschnitt 'require' in package-lock.json
  2. Fügen Sie die aktualisierte Abhängigkeit unter DevDependencies in package.json hinzu, damit Module, die sie benötigen, weiterhin darauf zugreifen können.
  3. npm i

-1

NPM Shrinkwrap bietet eine gute Lösung für dieses Problem. Es ermöglicht uns, diese Version einer bestimmten Abhängigkeit eines bestimmten Untermoduls zu überschreiben.

Wenn Sie npm install ausführen, überprüft npm im Wesentlichen zunächst in Ihrem Stammverzeichnis, ob eine Datei npm-shrinkwrap.json vorhanden ist. Wenn dies der Fall ist, wird dies zuerst verwendet, um die Paketabhängigkeiten zu bestimmen und dann zum normalen Prozess des Durcharbeitens der package.json-Dateien zurückzukehren.

Um eine npm-shrinkwrap.json zu erstellen, müssen Sie nur noch etwas tun

 npm shrinkwrap --dev

Code:

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

3
Unterscheidet sich dies von der aktuell akzeptierten Antwort? Diese Antwort enthält zwei positive Kommentare, die darauf hinweisen, dass neuere Versionen von npm entweder zusätzliche manuelle Schritte erfordern oder unerwünschte Dinge mit dieser Lösung tun. Ist das nicht der Fall?
Fabio Beltramini

-1

Ich habe eine Lösung gefunden, die für mich funktioniert.

So. Bearbeiten Sie zuerst Ihre Datei npm-shrinkwrap.json wie von allen anderen Lösungen empfohlen.

Dann (unter Windows):

  • Klicken Sie mit der rechten Maustaste auf die Datei 'npm-shrinkwrap.json'
  • Eigenschaften
  • Wählen Sie unter Attribute die Option 'Schreibgeschützt'. Dadurch wird verhindert, dass npm die Datei mpn-shrinkwrap.json ändert.

Die anderen vorgeschlagenen Lösungen sind gut genug, wenn Sie die 'npm-Installation' nur einmal ausführen. Nach der ersten 'npm-Installation' wird die Datei 'npm-shrinkwrap.json' jedoch erneut wie vor Ihrer Änderung geändert.


-1: Dazu müssen Sie die Datei jedes Mal erneut entsperren, wenn Sie Änderungen vornehmen möchten. In diesen Fällen würden Sie die manuellen Änderungen an der Shrinkwrap-Datei ohnehin verlieren. Darüber hinaus muss jeder, der an Ihrem Code mitarbeitet, auch diesen Hack aktivieren.
Thomaux
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.