Zusammenfassung wichtiger Verhaltensunterschiede:
Verwandte Optionen, die hier nicht behandelt werden:
devDependencies
dependenciesmüssen ausgeführt werden, devDependenciesnur um zu entwickeln, zB: Unit-Tests, CoffeeScript-zu-JavaScript-Transpilation, Minimierung, ...
Wenn Sie ein Paket entwickeln möchten, laden Sie es herunter (z. B. über git clone), gehen Sie zu seinem Stammverzeichnis, das Folgendes enthält package.json, und führen Sie Folgendes aus:
npm install
Da Sie über die eigentliche Quelle verfügen, ist klar, dass Sie sie entwickeln möchten. Standardmäßig werden also sowohl Abhängigkeiten dependencies(da Sie diese natürlich ausführen müssen, um sie zu entwickeln) als auch devDependencyAbhängigkeiten installiert.
Wenn Sie jedoch nur ein Endbenutzer sind, der nur ein Paket installieren möchte, um es zu verwenden, können Sie dies aus einem beliebigen Verzeichnis tun:
npm install "$package"
In diesem Fall möchten Sie normalerweise keine Entwicklungsabhängigkeiten, sodass Sie nur das erhalten, was für die Verwendung des Pakets erforderlich ist : dependencies.
Wenn Sie in diesem Fall wirklich Entwicklungspakete installieren möchten, können Sie die devKonfigurationsoption truemöglicherweise über die Befehlszeile wie folgt festlegen :
npm install "$package" --dev
Die Option ist false standardmäßig aktiviert, da dies ein viel seltenerer Fall ist.
peerDependencies
(Getestet vor 3.0)
Quelle: https://nodejs.org/en/blog/npm/peer-dependencies/
Bei regulären Abhängigkeiten können Sie mehrere Versionen der Abhängigkeit haben: Sie wird einfach in der installiert node_modules der Abhängigkeit .
Wenn beispielsweise dependency1und dependency2beide von dependency3unterschiedlichen Versionen abhängen, sieht der Projektbaum folgendermaßen aus:
root/node_modules/
|
+- dependency1/node_modules/
| |
| +- dependency3 v1.0/
|
|
+- dependency2/node_modules/
|
+- dependency3 v2.0/
Plugins sind jedoch Pakete, für die normalerweise kein anderes Paket erforderlich ist, das in diesem Zusammenhang als Host bezeichnet wird . Stattdessen:
- Plugins werden vom Host benötigt
- Plugins bieten eine Standardschnittstelle, die der Host voraussichtlich finden wird
- Nur der Host wird direkt vom Benutzer aufgerufen, daher muss es eine einzige Version davon geben.
Wenn z. B. dependency1und dependency2Peer davon abhängen dependency3, sieht der Projektbaum folgendermaßen aus:
root/node_modules/
|
+- dependency1/
|
+- dependency2/
|
+- dependency3 v1.0/
Dies geschieht, obwohl Sie dies dependency3in Ihrer package.jsonDatei nie erwähnt haben .
Ich denke, dies ist ein Beispiel für das Entwurfsmuster Inversion of Control .
Ein prototypisches Beispiel für Peer-Abhängigkeiten ist Grunt, der Host und seine Plugins.
Auf einem Grunt-Plugin wie https://github.com/gruntjs/grunt-contrib-uglify sehen Sie beispielsweise Folgendes :
grunt ist ein peer-dependency
- Das einzige
require('grunt')ist unter tests/: Es wird nicht wirklich vom Programm verwendet.
Wenn der Benutzer dann ein Plugin verwendet, benötigt er das Plugin implizit von der, Gruntfileindem er eine grunt.loadNpmTasks('grunt-contrib-uglify')Zeile hinzufügt. gruntDer Benutzer ruft jedoch direkt an.
Dies würde dann nicht funktionieren, wenn jedes Plugin eine andere Grunt-Version benötigt.
Handbuch
Ich denke, die Dokumentation beantwortet die Frage ziemlich gut. Vielleicht sind Sie mit Knoten- / anderen Paketmanagern nicht nur vertraut genug. Ich verstehe es wahrscheinlich nur, weil ich etwas über Ruby Bundler weiß.
Die Schlüsselzeile lautet:
Diese Dinge werden beim Ausführen von npm link oder npm install vom Stammverzeichnis eines Pakets installiert 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.
optionalDependenciesjetzt gibt.