Warum definiert beispielsweise ein Grunt-Plugin seine Abhängigkeit von Grunt als " Peer-Abhängigkeiten "?
Warum kann das Plugin nicht einfach Grunt als eigene Abhängigkeit in grunt-plug / node_modules haben ?
Peer-Abhängigkeiten werden hier beschrieben: https://nodejs.org/en/blog/npm/peer-dependencies/
Aber ich verstehe es nicht wirklich.
Beispiel
Ich arbeite zurzeit mit AppGyver-Steroiden, die Grunt-Tasks verwenden, um meine Quelldateien in einem Ordner / dist / zu erstellen, der auf einem lokalen Gerät bereitgestellt werden soll. Ich bin ziemlich neu bei npm und grunze, also möchte ich vollständig verstehen, was los ist.
Bisher verstehe ich das:
[rootfolder] /package.json teilt npm mit, dass es grunt-steroids
für die Entwicklung vom npm-Paket abhängt :
"devDependencies": {
"grunt-steroids": "0.x"
},
In Ordnung. Wenn Sie npm install in [rootfolder] ausführen, wird die Abhängigkeit erkannt und grunt-steroids in [rootfolder] / node_modules / grunt-steroids installiert .
Npm liest dann [rootfolder] /node_modules/grunt-steroids/package.json, damit es grunt-steroids
eigene Abhängigkeiten installieren kann :
"devDependencies": {
"grunt-contrib-nodeunit": "0.3.0",
"grunt": "0.4.4"
},
"dependencies": {
"wrench": "1.5.4",
"chalk": "0.3.0",
"xml2js": "0.4.1",
"lodash": "2.4.1"
},
"peerDependencies": {
"grunt": "0.4.4",
"grunt-contrib-copy": "0.5.0",
"grunt-contrib-clean": "0.5.0",
"grunt-contrib-concat": "0.4.0",
"grunt-contrib-coffee": "0.10.1",
"grunt-contrib-sass": "0.7.3",
"grunt-extend-config": "0.9.2"
},
Die " Abhängigkeiten " -Pakete werden in [rootfolder] / node_modules / grunt-steroids / node_modules installiert, was für mich logisch ist.
Die " devDependencies " sind nicht installiert, was sicher durch die Erkennung von npm gesteuert wird, die ich nur zu verwenden versuche grunt-steroids
und nicht darauf entwickle.
Aber dann haben wir die " peerDependencies ".
Diese sind in [rootfolder] / node_modules installiert , und ich verstehe nicht, warum und nicht in [rootfolder] / node_modules / grunt-steroids / node_modules, damit Konflikte mit anderen Grunt-Plugins (oder was auch immer) vermieden werden?
quelle
"grunt": "0.4.4"
sowohl in devDependencies als auch in peerDependencies der Fall ist, und es ist für mich sinnvoll, dort ein Duplikat zu haben, da dies sowohl bedeutet, dass ich diesesgrunt
Paket für meinen eigenen Gebrauch benötige , als auch, dass die Benutzer von my Die Bibliothek kann ihre eigene Version verwenden, sofern die Versionssperre für peerDependencies eingehalten wird. Ist das korrekt? Oder ist das OP-Beispiel sehr schlecht?JacksModule
davon abhängig ,JillsModule ^1.0.0
mitJillsModule
einer Peer - Abhängigkeit des SeinJacksModule
undYourCoolProject
wurden mitJacksModule
undJillsModule ^2.0.0
wir werden die Peer - Abhängigkeit Warnung von NPM erhalten, die uns beraten installierenJillsModule ^1.0.0
als auch. Aber was passiert dann?YourCoolProject
wird jetzt zwei Versionen vonJillsModule
importierbar habenimport jillsModule from "..."
? Und wie erinnere ich mich daran, dass ich bei der VerwendungJacksModule
eine Instanz von übergeben mussJillsModule v1.0.0
?JacksModule
Repo, aktualisieren Sie es, um davon abhängig zu sein,JillsModule ^2.0.0
und bieten Sie dem Projektbetreuer eine PR an. Es kann hilfreich sein, zuerst einen Fehler zu melden, der besagt, dass diese Abhängigkeit veraltet ist, und Sie möchten helfen, sie zu aktualisieren. Wenn Sie eine gute PR machen, werden die meisten Bibliotheksbetreuer sie zusammenführen und sich dafür bedanken. Wenn die Betreuer nicht reagieren, können Sie Ihre Abzweigung in NPM-Namespaces unter Ihrem Namen veröffentlichen und stattdessen Ihre Abzweigung verwenden. In jedem Fall gibt es Lösungen, diepeerDependencies
jedoch nicht von alleine gelöst werden.Ich würde Ihnen empfehlen, den Artikel zuerst noch einmal zu lesen. Es ist ein bisschen verwirrend, aber das Beispiel mit Winston-Mail zeigt Ihnen die Antwort, warum:
In diesem Fall ist es möglich, mehrere Versionen eines Pakets zu haben, was einige Probleme verursachen würde. Mit Peer-Abhängigkeiten können npm-Entwickler sicherstellen, dass der Benutzer über das spezifische Modul verfügt (im Stammordner). Sie haben jedoch Recht mit dem Punkt, dass die Beschreibung einer bestimmten Version eines Pakets zu Problemen mit anderen Paketen führen würde, die andere Versionen verwenden. Dieses Problem hat mit npm-Entwicklern zu tun, wie in den Artikeln angegeben
Daher sollten Entwickler Semver folgen, um PeerDependencies zu definieren. Sie sollten ein Problem für das Grunt-Steroids-Paket auf GitHub öffnen ...
quelle
multiple versions of a package which would cause some issues
aber ist das nicht der springende Punkt eines Paketmanagers? Sie diskutieren dies sogar weiter oben in demselben Artikel, in dem das Projekt zwei Versionen desselben Pakets enthält: eine vom Entwickler und eine von einer Bibliothek eines Drittanbieters.winston
Beispiel kann ich diewinston-mail
Bibliothek jetzt einfach nicht verwenden, weil meine Version nicht mit der Peer-Abhängigkeit übereinstimmt. Ich hätte dieses vorübergehende Downgrade von der neuesten und besten für die 1-Bibliothek viel lieber, als es überhaupt nicht verwenden zu können.peerDependencies
erklärt mit dem einfachsten möglichen Beispiel:Wenn Sie npm install in myPackage ausführen, wird ein Fehler ausgegeben, da versucht wird, die React-Version
^15.0.0
UND zu installieren,foo
die nur mit React kompatibel ist^16.0.0
.peerDependencies werden NICHT installiert.
quelle
foo
Arbeiten sowohl mit 15 Reagieren und Reagieren 16 dann könnte seine peerDependency Liste als>=15 < 17
.