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 schwierig ist, einfache Wörter zu wählen?
EDIT wurde hinzugefügt peerDependencies
, was eng miteinander verbunden ist und Verwirrung stiften kann.
optionalDependencies
jetzt gibt.Antworten:
Zusammenfassung wichtiger Verhaltensunterschiede:
dependencies
sind auf beiden installiert:npm install
aus einem Verzeichnis, das enthältpackage.json
npm install $package
in einem anderen VerzeichnisdevDependencies
sind:npm install
in einem Verzeichnis installiert , das enthältpackage.json
, es sei denn, Sie übergeben die--production
Flagge (stimmen Sie der Antwort von Gayan Charith zu ).npm install "$package"
in einem anderen Verzeichnis installiert , es sei denn, Sie geben ihm die--dev
Option.peerDependencies
::npm install
, und Sie müssen die Abhängigkeit manuell selbst lösen. Wenn beim Ausführen die Abhängigkeit fehlt, wird ein Fehler angezeigt (von @nextgentech erwähnt ).Transitivität (erwähnt von Ben Hutchison ):
dependencies
werden transitiv installiert: Wenn A B benötigt und B C benötigt, wird C installiert, andernfalls könnte B nicht funktionieren und A auch nicht.devDependencies
wird nicht transitiv installiert. Zum Beispiel müssen wir B nicht testen, um A zu testen, sodass die Testabhängigkeiten von B weggelassen werden können.Verwandte Optionen, die hier nicht behandelt werden:
bundledDependencies
Dies wird in der folgenden Frage erläutert : Vorteile von BundledDependencies gegenüber normalen Abhängigkeiten in NPMoptionalDependencies
(erwähnt von Aidan Feldman )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ältpackage.json
, und führen Sie Folgendes aus: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 auchdevDependency
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:
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
Konfigurationsoptiontrue
möglicherweise über die Befehlszeile wie folgt festlegen :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
unddependency2
beide vondependency3
unterschiedlichen Versionen abhängen, sieht der Projektbaum folgendermaßen aus:Plugins sind jedoch Pakete, für die normalerweise kein anderes Paket erforderlich ist, das in diesem Zusammenhang als Host bezeichnet wird . Stattdessen:
Wenn z. B.
dependency1
unddependency2
Peer davon abhängendependency3
, sieht der Projektbaum folgendermaßen aus:Dies geschieht, obwohl Sie dies
dependency3
in Ihrerpackage.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 einpeer-dependency
require('grunt')
ist untertests/
: 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 einegrunt.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:
Und dann unter npm-config (7) finden
dev
:quelle
npm install package
es sich um einen Befehl handelt, mit dem Sie alle Pakete installieren würden, bei denen es sich nicht um Entwicklungsabhängigkeiten handelt, und nicht um das, was Sie jetzt gemeint haben, nämlich "Installieren des Pakets mit dem Namen [Paket]" bevor Sie dies lesen. Wenn ich Sie wäre, würde ich bearbeiten, um [Paketname] zu sagen, was deutlich zeigt, dass Sie "Name hier einfügen" meinen.peerDependencies
Verhalten in der kommenden npm @ 3 widerzuspiegeln . Von blog.npmjs.org/post/110924823920/npm-weekly-5 : "Wir werden die Peer-Abhängigkeit nicht mehr automatisch herunterladen. Stattdessen werden wir Sie warnen, wenn die Peer-Abhängigkeit noch nicht installiert ist. Dies erfordert Sie Um PeerDependency-Konflikte manuell zu lösen, sollte dies auf lange Sicht die Wahrscheinlichkeit verringern, dass Sie mit den Abhängigkeiten Ihrer Pakete in eine schwierige Situation geraten. "npm install
von Paket A ausgeführt werden, erhalten Sie B und C, jedoch nicht D.devDependencies
nicht installiert wird, wenn eingestelltNODE_ENV
istproduction
.Wenn Sie devDependencies nicht installieren möchten, können Sie verwenden
npm install --production
quelle
--save
Option nicht mehr erforderlich. Wenn Sie "npm install my-package" ausführen, wird my-package als Abhängigkeit in Ihrepackage.json
Datei eingefügt.Zum Beispiel wäre Mokka normalerweise eine devDependency, da das Testen in der Produktion nicht erforderlich ist, während express eine Abhängigkeit wäre.
quelle
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ängig von C abhängt, installiert npm install on A B und C).
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 in Javascript, Testframeworks oder Dokumentationsgeneratoren kompilieren.
Sie werden nicht transitiv installiert (wenn A von B dev abhängt - abhängig von C, installiert npm install on A nur B).
Beispiel: grunzen: Ihr Projekt verwendet grunzen, um sich selbst zu erstellen.
peerDependencies
Abhängigkeiten, die Ihr Projekt in das übergeordnete Projekt einbindet oder ändert, normalerweise ein Plugin für eine andere Bibliothek oder ein anderes Tool. Es soll lediglich überprüft werden, ob das übergeordnete Projekt (Projekt, das von Ihrem Projekt abhängt) von dem Projekt abhängt, in das Sie sich einbinden. Wenn Sie also ein Plugin C erstellen, das der Bibliothek B Funktionen hinzufügt, muss jemand, der ein Projekt A erstellt, eine Abhängigkeit von B haben, wenn er eine Abhängigkeit von C hat.
Sie sind nicht installiert (es sei denn, npm <3), sondern nur überprüft auf.
Beispiel: Grunzen: Ihr Projekt erweitert das Grunzen um Funktionen und kann nur für Projekte verwendet werden, die Grunzen verwenden.
In dieser Dokumentation werden Peer-Abhängigkeiten sehr gut erläutert: https://nodejs.org/en/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/cli/blob/latest/doc/files/package.json.md#devdependencies
quelle
So speichern Sie ein Paket in package.json als Entwicklungsabhängigkeiten :
Wenn Sie es ausführen
npm install
, werden sowohldevDependencies
und als auch installiertdependencies
. So vermeiden Sie einen InstallationslaufdevDependencies
:quelle
Es gibt einige Module und Pakete, die nur für die Entwicklung erforderlich sind und in der Produktion nicht benötigt werden. Wie es in der Dokumentation steht :
quelle
Eine einfache Erklärung, die es mir klarer gemacht hat, ist:
Wenn Sie Ihre App bereitstellen, müssen Module in Abhängigkeiten installiert werden, sonst funktioniert Ihre App nicht. Module in devDependencies müssen nicht auf dem Produktionsserver installiert werden, da Sie nicht auf diesem Computer entwickeln. Verknüpfung
quelle
vendor.js
, sollten alle unsere Deps Dev Deps sein, wenn kompilierter Code in das Repo übernommen wird. Und es sollte festgeschrieben werden, da es sonst seltsam ist, dass Sie das Modul kompilieren und nicht nur installieren müssen (und das Testen ist auch hier irgendwo, da jede Änderung der Submodule zur Regression führen kann) ...webpack -p
meine ich. Bitte beantworte meine Frage.Ich möchte der Antwort meine Ansicht zu diesen Erklärungen zu Abhängigkeiten hinzufügen
dependencies
werden für die direkte Verwendung in Ihrer Codebasis verwendet, für Dinge, die normalerweise im Produktionscode landen, oder für CodestückedevDependencies
werden für den Erstellungsprozess verwendet, Tools, mit denen Sie verwalten können, wie der Endcode enden wird, Testmodule von Drittanbietern (z. B. Webpack-Inhalte)quelle
Zusamenfassend
Abhängigkeiten -
npm install <package> --save-prod
Installiert Pakete, die von Ihrer Anwendung in der Produktionsumgebung benötigt werden.DevDependencies - Installiert
npm install <package> --save-dev
Pakete, die nur für die lokale Entwicklung und das Testen erforderlich sindDurch
npm install
einfaches Eingeben werden alle in package.json genannten Pakete installiertWenn Sie also an Ihrem lokalen Computer arbeiten, geben Sie einfach ein
npm install
und fahren Sie fort :)quelle
peerDependencies
machte für mich keinen Sinn, bis ich diesen Ausschnitt aus einem Blog-Beitrag zum oben erwähnten Thema Ciro las :Das Plugin erwartet eine bestimmte Version des Hosts ...
peerDependencies
sind für Plugins Bibliotheken, die eine "Host" -Bibliothek benötigen, um ihre Funktion auszuführen, aber möglicherweise zu einem Zeitpunkt geschrieben wurden, bevor die neueste Version des Hosts veröffentlicht wurde.Das heißt, wenn ich
PluginX v1
für schreibeHostLibraryX v3
und weggehe, gibt es keine Garantie, dassPluginX v1
es funktioniert, wennHostLibraryX v4
(oder sogarHostLibraryX v3.0.1
) veröffentlicht wird.... aber das Plugin hängt nicht vom Host ab ...
Aus der Sicht des Plugins, nur fügt Funktionen an die Host - Bibliothek. Ich "brauche" den Host nicht wirklich, um einem Plugin eine Abhängigkeit hinzuzufügen, und Plugins hängen oft nicht buchstäblich von ihrem Host ab. Wenn Sie den Host nicht haben, macht das Plugin harmlos nichts.
Dies bedeutet, dass
dependencies
es nicht wirklich das richtige Konzept für Plugins ist.Schlimmer noch, wenn mein Host wie eine Abhängigkeit behandelt würde, würden wir in der Situation enden, die in demselben Blog-Beitrag erwähnt wird (ein wenig bearbeitet, um den Host & das Plugin dieser Antwort zu verwenden):
... und der Host hängt offensichtlich nicht vom Plugin ab ...
... das ist der springende Punkt bei Plugins. Wenn der Host nett genug wäre, Abhängigkeitsinformationen für alle seine Plugins aufzunehmen, würde dies das Problem lösen, aber auch ein riesiges neues kulturelles Problem mit sich bringen : Plugin-Management!
Der springende Punkt bei Plugins ist, dass sie anonym gekoppelt werden können. In einer perfekten Welt wäre es ordentlich, wenn der Gastgeber sie alle verwaltet, aber wir werden keine Bibliotheken benötigen, die Katzen hüten.
Wenn wir nicht hierarchisch abhängig sind, sind wir vielleicht voneinander abhängige Kollegen ...
Stattdessen haben wir das Konzept, Gleichaltrige zu sein. Weder Host noch Plugin befinden sich im Abhängigkeitseimer des anderen. Beide leben auf derselben Ebene des Abhängigkeitsgraphen.
... aber das ist keine automatisierbare Beziehung. <<< Moneyball !!!
Wenn ich ein Peer von bin
PluginX v1
( also eine Peer- Abhängigkeit von ) erwarteHostLibraryX v3
, werde ich es sagen. Wenn Sie auf die neueste Auto-Upgrade habenHostLibraryX v4
(beachten Sie, dass die Version 4 ) und habenPlugin v1
installiert ist , müssen Sie wissen, nicht wahr?npm
kann diese Situation für mich nicht bewältigen -... oder...
Wie wäre es mit nein, npm?!
Npm also nicht. Es macht Sie auf die Situation aufmerksam und lässt Sie herausfinden, ob
HostLibraryX v4
es sich um einen geeigneten Peer handeltPlugin v1
.Koda
Durch eine gute
peerDependency
Verwaltung der Plugins funktioniert dieses Konzept in der Praxis intuitiver. Aus dem Blog-Beitrag noch einmal ...quelle
Abhängigkeiten gegen Entwicklungsabhängigkeiten
Entwicklungsabhängigkeiten sind Module, die nur während der Entwicklung benötigt werden, während Abhängigkeiten zur Laufzeit erforderlich sind. Wenn Sie Ihre Anwendung bereitstellen, müssen Abhängigkeiten installiert werden, sonst funktioniert Ihre App einfach nicht. Bibliotheken, die Sie aus Ihrem Code aufrufen, mit dem das Programm ausgeführt werden kann, können als Abhängigkeiten betrachtet werden.
ZB reagieren, reagieren - dom
Dev-Abhängigkeitsmodule müssen nicht auf dem Produktionsserver installiert werden, da Sie nicht auf diesem Computer entwickeln werden. Compiler, die Ihren Code in Javascript, Testframeworks und Dokumentgeneratoren umwandeln, können als Dev-Abhängigkeiten betrachtet werden, da sie nur während der Entwicklung benötigt werden.
ZB ESLint, Babel, Webpack
@ FYI,
Wenn Sie auf npm veröffentlichen, ist es wichtig, dass Sie das richtige Flag für die richtigen Module verwenden. Wenn Ihr npm-Modul funktionieren muss, speichern Sie das Modul mit dem Flag "--save" als Abhängigkeit. Wenn Ihr Modul nicht funktionieren muss, aber zum Testen benötigt wird, verwenden Sie das Flag "--save-dev".
quelle
Wenn Sie versuchen, ein npm-Paket zu verteilen, sollten Sie die Verwendung vermeiden
dependencies
. Stattdessen müssen Sie in Betracht ziehen, es hinzuzufügenpeerDependencies
oder daraus zu entfernendependencies
.quelle
Ich habe eine einfache Erklärung gefunden.
Kurze Antwort:
Abhängigkeiten "... sind diejenigen, die Ihr Projekt wirklich braucht, um in der Produktion arbeiten zu können."
devDependencies "... sind diejenigen, die Sie während der Entwicklung benötigen."
peerDependencies "Wenn Sie Ihre eigene Bibliothek erstellen und veröffentlichen möchten, damit sie als Abhängigkeit verwendet werden kann"
Weitere Details in diesem Beitrag: https://code-trotter.com/web/dependencies-vs-devdependencies-vs-peerdependencies
quelle