Zusammenfassung wichtiger Verhaltensunterschiede:
Verwandte Optionen, die hier nicht behandelt werden:
devDependencies
dependencies
müssen ausgeführt werden, devDependencies
nur 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 devDependency
Abhä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 dev
Konfigurationsoption true
mö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 dependency1
und dependency2
beide von dependency3
unterschiedlichen 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. dependency1
und dependency2
Peer davon abhängen dependency3
, sieht der Projektbaum folgendermaßen aus:
root/node_modules/
|
+- dependency1/
|
+- dependency2/
|
+- dependency3 v1.0/
Dies geschieht, obwohl Sie dies dependency3
in Ihrer package.json
Datei 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, Gruntfile
indem er eine grunt.loadNpmTasks('grunt-contrib-uglify')
Zeile hinzufügt. grunt
Der 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.
optionalDependencies
jetzt gibt.