711 Stimmen

Wie kann ich verschachtelte NPM-Abhängigkeitsversionen außer Kraft setzen?

Ich würde gerne die grunt-contrib-jasmine NPM-Paket. Es hat verschiedene Abhängigkeiten. Ein Teil des Abhängigkeitsgraphen sieht wie folgt 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 phantomjs was eine korrekte Installation unter Mac OS X verhindert. Dies ist in der neuesten Version behoben.

Wie kann ich die grunt-lib-phantomjs zur Verwendung einer neueren Version von phantomjs ?

Einige zusätzliche Informationen:

390voto

izogfif Punkte 3756

Ab npm cli v8.3.0 (2021-12-09) kann dieses Problem mit der overrides Feld von package.json . Wie beschrieben in Antwort von StriplingWarrior

Zum Beispiel hat das Projekt typescript Version 4.6.2 als direkt Abhängigkeit von der Entwicklung und awesome-typescript-loader die alte Version verwendet 2.7 de typescript . So können Sie erkennen npm Version zu verwenden 4.6.2 de typescript für awesome-typescript-loader :

{
  "name": "myproject",
  "version": "0.0.0",
  "scripts": ...
  "dependencies": ...
  "devDependencies": {
    "typescript": "~4.6.2",
    "awesome-typescript-loader": "^5.2.1",
    ...
  },
  "overrides": {
    "awesome-typescript-loader": {
      "typescript": "$typescript"
    }
  }
}

Wenn Sie nicht typescript als direkt Entwicklungsabhängigkeit, dann müssen Sie schreiben 4.6.2 anstelle von $typescript en overrides Abschnitt:

{
  "name": "myproject",
  "version": "0.0.0",
  "scripts": ...
  "dependencies": ...
  "devDependencies": {
    "awesome-typescript-loader": "^5.2.1",
    ...
  },
  "overrides": {
    "awesome-typescript-loader": {
      "typescript": "~4.6.2"
    }
  }
}

Für die Verwendung der neuesten Version der Abhängigkeiten:

{
  "name": "myproject",
  "version": "0.0.0",
  "scripts": ...
  "dependencies": ...
  "devDependencies": {
    "awesome-typescript-loader": "^5.2.1",
    ...
  },
  "overrides": {
    "awesome-typescript-loader": {
      "typescript": "latest"
    }
  }
}

Gleiche overrides kann für beides verwendet werden dependencies y devDependencies .


Wenn Sie eine npm-Version >5 aber <8.3.0 verwenden: Bearbeiten Sie Ihre package-lock.json : Entfernen Sie die Bibliothek aus "requires" und fügen Sie sie unter "Abhängigkeiten" hinzu.

Sie möchten zum Beispiel deglob Paket zu verwenden glob Paket-Version 3.2.11 anstelle des aktuellen. Sie öffnen package-lock.json und 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 "glob": "7.1.2", von "requires" , hinzufügen "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 Ihre node_modules Ordner, führen Sie npm ci (o npm install für alte Versionen von node/npm) und fügt die fehlenden Teile der "dependencies" Abschnitt.


307voto

StriplingWarrior Punkte 141402

Ab npm v8.3 (freigegeben mit Node.js 16 ), ist der korrekte Weg, damit umzugehen, über die overrides Abschnitt Ihres package.json archivo.

Wenn Sie bestimmte Änderungen an den Abhängigkeiten Ihrer Abhängigkeiten vornehmen müssen, zum Beispiel die Version einer Abhängigkeit mit einem bekannten Sicherheitsproblem, das Ersetzen einer bestehenden Abhängigkeit durch einen Fork, oder Sicherstellen, dass überall die gleiche Version eines Pakets verwendet wird, dann können Sie einen Override hinzufügen.

Überschreibungen bieten eine Möglichkeit, ein Paket in Ihrer Abhängigkeitsstruktur zu ersetzen durch eine andere Version oder ein ganz anderes Paket zu ersetzen. Diese Änderungen können können so spezifisch oder so vage wie gewünscht definiert werden.

Um sicherzustellen, dass das Paket foo immer in der Version 1.0.0 installiert wird, egal installiert wird, unabhängig davon, von welcher Version Ihre Abhängigkeiten abhängen:

{
  "overrides": {
    "foo": "1.0.0"
  }
}

Es gibt eine Vielzahl anderer, differenzierterer Konfigurationen, die es Ihnen ermöglichen, ein Paket nur dann zu überschreiben, wenn es eine Abhängigkeit einer bestimmten Pakethierarchie ist. Für weitere Details, siehe https://docs.npmjs.com/cli/v9/configuring-npm/package-json#overrides

289voto

tuxpiper Punkte 3293

Sie können verwenden npm shrinkwrap Funktionalitäten, um Abhängigkeiten oder Unterabhängigkeiten außer Kraft zu setzen.

Ich habe dies gerade in einem grunt Projekt von uns. Wir brauchten eine neuere Version von connect, da 2.7.3 . hat uns Probleme bereitet. Also habe ich eine Datei namens npm-shrinkwrap.json :

{
  "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 bei der Installation für das Projekt automatisch übernommen werden.

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

106voto

user11153 Punkte 7691

Die einzige Lösung, die bei mir funktionierte (node 12.x, npm 6.x), war die Verwendung von npm-force-resolutions entwickelt von @Rogerio Chaves .

Installieren Sie es zunächst:

npm install npm-force-resolutions --save-dev

Sie können hinzufügen --ignore-scripts wenn einige kaputte Skripte für transitive Abhängigkeiten Sie daran hindern, etwas zu installieren.

Dann in package.json definieren, welche Abhängigkeit außer Kraft gesetzt werden soll (Sie müssen die genaue Versionsnummer ):

"resolutions": {
  "your-dependency-name": "1.23.4"
}

und in "scripts" Abschnitt einen neuen Vorinstallationseintrag hinzufügen:

"preinstall": "npm-force-resolutions",

Ahora, npm install werden die Änderungen übernommen und erzwingen your-dependency-name Version zu sein 1.23.4 für alle Abhängigkeiten.

68voto

Gus Punkte 5515

Für diejenigen, die Garn verwenden.

Ich habe versucht, npm shrinkwrap zu verwenden, bis ich entdeckte, dass der yarn cli meine npm-shrinkwrap.json-Datei ignorierte.

Garn hat https://yarnpkg.com/lang/en/docs/selective-version-resolutions/ für diese. Ordentlich.

Sehen Sie sich auch diese Antwort an: https://stackoverflow.com/a/41082766/3051080

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X