Frage Was ist der Unterschied zwischen Abhängigkeiten, devDependencies und peerDependencies in der Datei npm package.json?


Diese Dokumentation beantwortet meine Frage sehr schlecht. Ich habe diese Erklärungen nicht verstanden. Kann jemand in einfacheren Worten sagen? Vielleicht mit Beispielen, wenn es schwer ist, einfache Wörter zu wählen?


1460
2017-09-18 14:57


Ursprung


Antworten:


Zusammenfassung wichtiger Verhaltensunterschiede:

  • dependencies sind auf beiden installiert:

    • npm install aus einem Verzeichnis, das enthält package.json
    • npm install $package in einem anderen Verzeichnis
  • devDependencies sind:

    • auch installiert auf npm install in einem Verzeichnis, das enthält package.json, es sei denn du passierst die --production Flagge (gehe upvote Gayan Chariths Antwort).
    • nicht installiert auf npm install "$package" in einem anderen Verzeichnis, es sei denn, Sie geben das --dev Möglichkeit.
    • sind nicht transitiv installiert.
  • peerDependencies:

    • vor 3.0: werden immer installiert, wenn sie fehlen, und einen Fehler auslösen, wenn mehrere inkompatible Versionen der Abhängigkeit von verschiedenen Abhängigkeiten verwendet werden.
    • erwartet ab 3.0 (ungetestet): Warnung geben, wenn sie fehlt npm installund Sie müssen die Abhängigkeit selbst manuell lösen. Wenn die Abhängigkeit fehlt, erhalten Sie beim Ausführen einen Fehler (von @nextgentech)
  • Transitivität (von Ben Hutchison):

    • dependencies werden transitiv installiert: Wenn A B erfordert und B C erfordert, wird C installiert, andernfalls könnte B nicht funktionieren, und auch A.

    • devDependencies sind nicht transitiv installiert. Z.B. Wir müssen B nicht testen, um A zu testen, daher können die Testabhängigkeiten von B weggelassen werden.

Ähnliche Optionen, die hier nicht behandelt werden:

devDependencies

dependencies werden benötigt, um zu laufen, devDependencies nur um zu entwickeln, z.B .: Komponententests, Coffeescript zu Javascript transpilation, minification, ...

Wenn Sie ein Paket entwickeln möchten, laden Sie es herunter (z. B. über git clone), gehe zu seiner Wurzel, die enthält package.json, und Renn:

npm install

Da du die eigentliche Quelle hast, ist klar, dass du sie entwickeln willst, also standardmäßig beides dependencies (da musst du natürlich rennen um zu entwickeln) und devDependency Abhängigkeiten werden ebenfalls installiert.

Wenn Sie jedoch nur ein Endbenutzer sind, der nur ein Paket installieren möchte, um es zu verwenden, werden Sie von jedem Verzeichnis aus tun:

npm install "$package"

In diesem Fall möchten Sie normalerweise nicht die Entwicklungsabhängigkeiten, also erhalten Sie nur, was benötigt wird, um das Paket zu verwenden: dependencies.

Wenn Sie in diesem Fall wirklich Entwicklungspakete installieren möchten, können Sie die dev Konfigurationsoption zu truemöglicherweise von der Kommandozeile aus als:

npm install "$package" --dev

Die Option ist false standardmäßig, da dies ein viel seltener Fall ist.

Peer-Abhängigkeiten

(getestet vor 3.0)

Quelle: https://nodejs.org/de/blog/npm/peer-dependencies/

Bei normalen Abhängigkeiten können Sie mehrere Versionen der Abhängigkeit haben: Sie wird einfach in der. Installiert node_modulesder Abhängigkeit.

Z.B. ob dependency1 und dependency2 beide hängen davon ab dependency3 Bei verschiedenen Versionen sieht der Projektbaum so aus:

root/node_modules/
                 |
                 +- dependency1/node_modules/
                 |                          |
                 |                          +- dependency3 v1.0/
                 |
                 |
                 +- dependency2/node_modules/
                                            |
                                            +- dependency3 v2.0/

Plugins sind jedoch Pakete, die normalerweise das andere Paket nicht benötigen, das heißt das Gastgeber in diesem Kontext. Stattdessen:

  • Plugins sind erforderlich vom Gastgeber
  • Plugins bieten eine Standardschnittstelle, die der Host erwartet
  • Nur der Host wird direkt vom Benutzer aufgerufen, daher muss es eine einzelne Version geben.

Z.B. ob dependency1 und dependency2 Peer abhängen dependency3, der Projektbaum sieht folgendermaßen aus:

root/node_modules/
                 |
                 +- dependency1/
                 |
                 +- dependency2/
                 |
                 +- dependency3 v1.0/

Dies geschieht, obwohl Sie nie erwähnen dependency3 in deinem package.json Datei.

Ich denke, das ist ein Beispiel für die Inversion der Kontrolle Design-Muster.

Ein prototypisches Beispiel für Peer-Abhängigkeiten ist Grunt, der Host und seine Plugins.

Zum Beispiel auf einem Grunt-Plugin wie https://github.com/gruntjs/grunt-contrib-uglify, du wirst das sehen:

  • grunt ist ein peerDependency
  • das einzige require('grunt') ist unter tests/: Es wird nicht wirklich von dem Programm verwendet.

Wenn der Benutzer dann ein Plugin verwendet, benötigt er implizit das Plugin von Gruntfile durch Hinzufügen von a grunt.loadNpmTasks('grunt-contrib-uglify') Linie, aber es ist grunt dass der Benutzer direkt anrufen wird.

Dies würde nicht funktionieren, wenn jedes Plugin eine andere Grunt-Version benötigt.

Handbuch

Ich denke, der Doc beantwortet die Frage ziemlich gut, vielleicht sind Sie nicht nur mit Knoten / anderen Paketmanagern vertraut genug. Ich verstehe es wahrscheinlich nur, weil ich etwas über Ruby Bundler weiß.

Die Schlüsselzeile ist:

Diese Dinge werden installiert, wenn npm link oder npm install vom Stamm eines Pakets ausgeführt wird, und können wie jeder andere npm-Konfigurationsparameter verwaltet werden. Weitere Informationen zum Thema finden Sie unter npm-config (7).

Und dann unter npm-config (7) finden dev:

Default: false
Type: Boolean

Install dev-dependencies along with packages.

1739
2018-02-25 04:25



Wenn Sie devDependencies nicht installieren möchten, können Sie einfach verwenden npm install --production 


361
2017-07-05 10:06



Als ein Beispiel wäre Mocha normalerweise eine devDependency, da Testen in der Produktion nicht notwendig ist, während express eine Abhängigkeit wäre.


91
2017-09-18 18:39



Um ein Paket zu speichern Paket.json als Dev-Abhängigkeiten:

npm install "$package" --save-dev

Wenn du rennst npm install Es wird beides installieren devDependencies und dependencies. Um zu vermeiden, installieren devDependencies Lauf:

npm install --production

48
2018-01-08 06:41



Es gibt einige Module und Pakete, die nur für die Entwicklung benötigt werden, die in der Produktion nicht benötigt werden. Wie es in der Dokumentation:

Wenn jemand plant, Ihr Modul in sein Programm zu laden und zu verwenden, dann wollen oder müssen sie wahrscheinlich das externe Test- oder Dokumentationsframework, das Sie verwenden, nicht herunterladen und erstellen. In diesem Fall sollten Sie diese zusätzlichen Elemente in einem devDependencies-Hash auflisten.


29
2017-09-18 14:59



Abhängigkeiten
Abhängigkeiten, die Ihr Projekt ausführen muss, z. B. eine Bibliothek, die Funktionen bereitstellt, die Sie aus Ihrem Code aufrufen.
Sie werden transitiv installiert (wenn A von B abhängt, hängt es von C ab, npm install auf A wird B und C installieren).
Beispiel: lodash: Ihr Projekt ruft einige lodash-Funktionen auf.

devDependencies
Abhängigkeiten, die Sie nur während der Entwicklung oder Veröffentlichung benötigen, wie Compiler, die Ihren Code aufnehmen und in Javascript, Test-Frameworks oder Dokumentationsgeneratoren kompilieren.
Sie werden nicht transitiv installiert (wenn A von B dev abhängt - hängt von C ab, npm install auf A wird nur B installieren).
Beispiel: grunt: Ihr Projekt verwendet grunt, um sich selbst zu erstellen.

Peer-Abhängigkeiten
Abhängigkeiten, an denen sich Ihr Projekt im übergeordneten Projekt beteiligt oder ändert, normalerweise ein Plugin für eine andere Bibliothek oder ein anderes Tool. Es ist lediglich eine Überprüfung, um sicherzustellen, dass das übergeordnete Projekt (Projekt, das von Ihrem Projekt abhängt) eine Abhängigkeit von dem Projekt hat, in das Sie sich einklinken. Wenn Sie also ein Plugin C erstellen, das der Bibliothek B Funktionalität hinzufügt, muss jemand, der ein Projekt A erstellt, eine Abhängigkeit von B haben, wenn sie von C abhängig sind.
Sie sind nicht installiert (außer npm <3), sie werden nur überprüft.
Beispiel: grunt: Ihr Projekt fügt grunt Funktionen hinzu und kann nur in Projekten verwendet werden, die grunt verwenden.

Diese Dokumentation erklärt Peer-Abhängigkeiten sehr gut: https://nodejs.org/de/blog/npm/peer-dependencies/ 

Außerdem wurde die npm-Dokumentation im Laufe der Zeit verbessert und bietet nun bessere Erklärungen für die verschiedenen Arten von Abhängigkeiten: https://github.com/npm/npm/blob/master/doc/files/package.json.md#devdependencies


18
2017-09-05 17:27



Eine einfache Erklärung, die es für mich klarer gemacht hat, ist:

Wenn Sie Ihre App bereitstellen, müssen Module in Abhängigkeiten installiert werden oder Ihre App wird nicht funktionieren. Module in devDependencies müssen nicht auf dem Produktionsserver installiert sein, da Sie nicht auf diesem Computer entwickeln. Verknüpfung


8
2017-09-29 15:36



Ich möchte der Antwort meine Sicht auf diese Abhängigkeiten-Erklärungen hinzufügen

  • dependencies werden für die direkte Verwendung in Ihrer Codebasis verwendet, Dinge, die normalerweise im Produktionscode enden, oder Teile des Codes
  • devDependencies werden für den Build-Prozess verwendet, Tools, die Ihnen helfen, zu verwalten, wie der Endcode endet, Testmodule von Drittanbietern (zB webpack stuff)

6
2018-02-16 11:40



Wenn Sie versuchen, ein npm-Paket zu verteilen, sollten Sie die Verwendung vermeiden dependencies. Stattdessen müssen Sie in Betracht ziehen, es hinzuzufügen peerDependencies oder entfernen Sie es aus dependencies.


0
2017-07-06 12:47