Was ist der Unterschied zwischen --save und --save-dev?

747

Was ist der Unterschied zwischen:

npm install [package_name] --save

und:

npm install [package_name] --save-dev

Was bedeutet das?

nfort
quelle
4
Ja, ich bin verwirrt darüber. Wenn Sie eine kontinuierliche Integration wie Jenkins verwenden, weiß Jenkins, dass er die devDependencies-Module zum Ausführen von Tests verwendet? Ich nehme an, aber es ist nicht sehr offensichtlich.
Alexander Mills
5
Bearbeiten Sie möglicherweise die Frage, um auch zu sagen, was der funktionale Unterschied zwischen Abhängigkeiten und devDependencies ist.
Alexander Mills
5
Über die Option --save-dev installierte Pakete werden bei der Ausführung durch den Benutzer nicht erneut installiert npm install --production. Das ist der betriebliche Unterschied ( weitere Informationen finden Sie unter https://docs.npmjs.com/cli/install ).
Andrew
7
@MuhammadUmer Genau deshalb stellen die Leute hier Fragen - um einen Hinweis zu bekommen. Vielleicht wäre das Hinzufügen einer echten Antwort produktiver - dies ist definitiv eine interessante Unterscheidung, die mir nicht bewusst war.
Simon_Weaver
3
Auch wenn Sie die Umgebungsvariable NODE_ENVauf Produktion setzen, npm installwerden Entwicklungspakete automatisch ausgeschlossen.
Muhammad Umer

Antworten:

591
  • --save-devwird verwendet, um das Paket für Entwicklungszwecke zu speichern. Beispiel: Unit-Tests, Minimierung ..
  • --save wird verwendet, um das Paket zu speichern, das für die Ausführung der Anwendung erforderlich ist.
Tuong Le
quelle
150
Wie unterscheiden sie sich? Wann würde ich eins gegen das andere verwenden? Kann ich das Paket trotzdem in der Produktion verwenden, wenn es unter --save-dev ist?
Dave Voyles
14
Die Antwort beantwortet kurz und bündig Ihre ersten beiden Fragen. Die Antwort auf die letzte Frage "Kann ich das Paket noch in der Produktion verwenden, wenn es sich unter --save-dev befindet" lautet "Nein". Dies ist zwar durchaus möglich , aber nicht beabsichtigt.
Technetium
61
-DKurzfassungen : ist kurz für --save-devund -Sist kurz für--save
chrisco
164
Diese Antwort ist frustrierend vage. Selbst ein kleines Beispiel würde wesentlich dazu beitragen, dies klarer zu machen.
Choylton B. Higginbottom
33
Beachten Sie, dass ab npm Version 5.0.0 die --saveOption nicht mehr erforderlich ist. Wenn Sie das tun npm install my-package, wird es „mein-Paket“ als eine Abhängigkeit in der package.json Datei hinzufügen.
Martin Carel
642

Der Unterschied zwischen --saveund ist --save-devmöglicherweise nicht sofort erkennbar, wenn Sie beide in Ihren eigenen Projekten ausprobiert haben. Also hier ein paar Beispiele ...

Nehmen wir an, Sie haben eine App erstellt, die das Moment- Paket zum Parsen und Anzeigen von Daten verwendet hat. Ihre App ist ein Scheduler, daher benötigt sie dieses Paket wirklich, um ausgeführt zu werden, wie in: Kann ohne es nicht ausgeführt werden . In diesem Fall würden Sie verwenden

npm install moment --save

Dies würde einen neuen Wert in Ihrer package.json erzeugen

"dependencies": {
   ...
   "moment": "^2.17.1"
}

Wenn Sie sich entwickeln, ist es wirklich hilfreich, Tools wie Testsuiten zu verwenden, und möglicherweise benötigen Sie Jasmin-Kern und Karma . In diesem Fall würden Sie verwenden

npm install jasmine-core --save-dev
npm install karma --save-dev

Dies würde auch einen neuen Wert in Ihrer package.json erzeugen

"devDependencies": {
    ...
    "jasmine-core": "^2.5.2",
    "karma": "^1.4.1",
}

Sie benötigen die Testsuite nicht, um die App im normalen Zustand auszuführen. Es handelt sich also um eine --save-devTypabhängigkeit, nicht mehr. Sie können sehen, dass es ein bisschen schwer vorstellbar ist, wenn Sie nicht verstehen, was wirklich passiert.

Entnommen direkt aus NPM docs docs # Abhängigkeiten

Abhängigkeiten

Abhängigkeiten werden in einem einfachen Objekt angegeben, das einen Paketnamen einem Versionsbereich zuordnet. Der Versionsbereich ist eine Zeichenfolge mit einem oder mehreren durch Leerzeichen getrennten Deskriptoren. Abhängigkeiten können auch mit einer Tarball- oder Git-URL identifiziert werden.

Bitte setzen Sie keine Testkabelbäume oder Transpiler in Ihr Abhängigkeitsobjekt. Siehe devDependencies weiter unten.

Selbst in den Dokumenten werden Sie aufgefordert, --save-dev für Module wie Testkabelbäume zu verwenden.

Ich hoffe das hilft und ist klar.

Michael Bruce
quelle
15
IMO, ich denke, das Schlüsselwort "Speichern" ist ein Problem. Warum setzen sie nicht das Flag -dev für die Entwicklung und -deploy für die Bereitstellung? Es ist sinnvoller als das Schlüsselwort "Speichern".
Thinh Vu
1
Warum weiß das Paket nicht einfach (entscheidet), ob es sich um ein Release-Paket oder ein Entwicklungspaket handelt, und --save kann für beide verwendet werden. Es scheint seltsam, den installierenden Benutzer dazu zu bringen, dies zu entscheiden, wenn der Paketentwickler die Absicht erstellt.
CodeGrue
4
CodeGrue: Wenn Sie jQuery nur zum Testen von React-Komponenten verwenden, wird es in save-dev gespeichert, aber Sie können es möglicherweise nicht zum Erstellen Ihres Hauptprojekts verwenden. Ja, das ist möglich. Warum sollte der Packager wissen, was Sie damit machen?
Michael Bruce
2
Viel klarer. Ich bin ein Embedded-Typ, der zum ersten Mal den Workflow von Bootstra + Node.j lernt. Es ist nicht offensichtlich, was der Unterschied von der Manschette ist.
Leroy105
3
@YakovL save-dev bedeutet, dass die Pakete nicht installiert werden, wenn jemand anderes Ihr Paket als Abhängigkeit installiert. Pakete, die nur zum Ausführen von Skripten wie Start / Build verwendet werden, werden in diesem Fall nicht benötigt, sodass sie in Entwicklungsabhängigkeiten versetzt werden. Wenn Sie an einer Web-App arbeiten und nicht an einem Paket, das von anderen verwendet werden soll, sollten Sie sich wahrscheinlich überhaupt keine Sorgen machen.
Riv
111

Standardmäßig installiert NPM einfach ein Paket unter node_modules. Wenn Sie versuchen, Abhängigkeiten für Ihre App / Ihr Modul zu installieren, müssen Sie diese zuerst installieren und dann dem dependenciesAbschnitt Ihres hinzufügen package.json.

--save-devFügt das Paket eines Drittanbieters zu den Entwicklungsabhängigkeiten des Pakets hinzu. Es wird nicht installiert, wenn jemand Ihr Paket installiert. Es ist in der Regel nur dann installiert , wenn jemand klont Ihren Quell - Repository und läuft npm installdarin.

--saveFügt das Paket eines Drittanbieters zu den Abhängigkeiten des Pakets hinzu. Es wird zusammen mit dem Paket installiert, wenn jemand ausgeführt wird npm install package.

Entwicklungsabhängigkeiten sind diejenigen Abhängigkeiten, die nur für die Entwicklung des Pakets benötigt werden. Dies kann Testläufer, Compiler, Packager usw. umfassen. Beide Arten von Abhängigkeiten werden in der Paketdatei package.jsongespeichert. --savefügt hinzu dependencies, --save-devfügt hinzudevDependencies

Die npm-Installationsdokumentation finden Sie hier.

Lakshmi Swetha G.
quelle
37
Ich habe das vermutet ... Sie können --save-dev und --save austauschbar verwenden, wenn Sie eine Web-App erstellen, die nicht zu einem Paket wird, dh von npm heruntergeladen wird, wenn Sie ein Paket entwickeln, um es mit anderen zu teilen ist wichtig, um den Unterschied zu verstehen.
VFein
13
Vielen Dank endlich jemand, der seinen Zweck sagt, wenn Sie npm install verwenden
CapturedTree
3
--save ist jetzt standardmäßig mit npm install mit der Veröffentlichung von npm 5 im Jahr 2017
NattyC
Warten Sie, warum komplexe Sätze? In DevDependecy kann der Entwickler die Pakete installieren, und es wird nur die devDevependency aktualisiert. Wenn ein neuer Entwickler die Projektcodebasis klont und npm install => hier nur dependency package name is going to install.in node_modules ausführt, nicht im Entwicklerpaket wie in Dev-Dependency.
Anupam Maurya
60

Ein perfektes Beispiel dafür ist:

$ npm install typescript --save-dev

In diesem Fall möchten Sie Typescript (eine durch Javascript analysierbare Codierungssprache) für die Entwicklung verfügbar haben. Sobald die App bereitgestellt ist, ist dies jedoch nicht mehr erforderlich, da der gesamte Code in Javascript transpiliert wurde. Daher wäre es nicht sinnvoll, es in die veröffentlichte App aufzunehmen. In der Tat würde es nur Speicherplatz beanspruchen und die Downloadzeiten verlängern.

Jackalope
quelle
4
Gleiches gilt für: "$ npm install grunt --save-dev", da es für die Entwicklung nützlich ist, aber nicht für die Bereitstellung.
Jackalope
1
Eine Randnotiz: Microsoft schlägt vor, @ types / xxx-Pakete als Abhängigkeiten zu installieren, nicht als devDependencies github.com/Microsoft/types-publisher/issues/81
Dave
2
Was ich verwirrend finde ist, wie wichtig das überhaupt ist? Mit gespeicherte Pakete --savewerden weiterhin nur im node_modulesOrdner gespeichert . Der Code ist nicht in der bereitgestellten Website enthalten.
Kokodoko
6
@Kokodoko Wenn Sie das --save-devFlag verwenden, wird das Paket Ihrem devDependenciesObjekt hinzugefügt . Wenn jemand Ihr Paket installiert , werden alle dependenciesheruntergeladen, die devDependenciesjedoch nicht, da sie zur Laufzeit nicht benötigt werden. Wie in der Antwort angegeben, sparen sie Zeit und Platz. Entwickler, die an Ihren Paketdateien selbst arbeiten, können diese einfach npm installim Paketverzeichnis ausführen , um sie ebenfalls zu installieren devDependencies.
Jasjit Singh Marwah
Wenn Sie also ein Repo von Github herunterladen und eingeben npm install, devDependencieswerden die ignoriert?
Kokodoko
41

Lassen Sie mich Ihnen ein Beispiel geben,

  • Sie sind Entwickler einer sehr ERNSTEN npm- Bibliothek . Welches verwendet verschiedene Testbibliotheken, um das Paket zu testen.
  • Ein Benutzer hat Ihre Bibliothek heruntergeladen und möchte sie in seinem Code verwenden. Müssen sie auch Ihre Testbibliotheken herunterladen? Vielleicht verwenden Sie jestzum Testen und sie verwenden mocha. Möchten Sie, dass sie auch installiert jestwerden? Nur um Ihre Bibliothek zu betreiben?

Kein Recht? Deshalb sind sie in devDependencies.

In diesem Fall werden npm i yourPackagenur die Bibliotheken installiert, die zum Ausführen Ihrer Bibliothek erforderlich sind . Andere Bibliotheken, mit denen Sie Ihren Code gebündelt oder getestet und verspottet haben, werden nicht installiert, da Sie sie eingefügt haben devDependencies. Ziemlich ordentlich, oder?

Also, Warum brauchen die Entwickler die belichten devDependancies ?

Angenommen, Ihr Paket ist ein Open-Source-Paket, und Hunderte von Personen senden Pull-Anfragen an Ihr Paket. Wie werden sie dann das Paket testen? Sie werden git cloneIhr Repo und wann sie npm idie Abhängigkeiten sowie devDependencies tun würden .
Weil sie Ihr Paket nicht verwenden. Sie entwickeln das Paket weiter. Um Ihr Paket zu testen, müssen sie die vorhandenen Testfälle bestehen und neue schreiben. Sie müssen also Ihre verwenden devDependencies, die alle von Ihnen verwendeten Test- / Gebäude- / Verspottungsbibliotheken enthält.

Aritra Chakraborty
quelle
8
Viel besser als die akzeptierte Antwort sowie die Antwort mit den maximalen Stimmen, da diese Antwort praktischer ist. Vielen Dank!
Nicht gefangene Ausnahme
Dies sollte die gewählte Antwort sein. Alle anderen Antworten erklären nicht wirklich, WARUM Sie eine über die andere verwenden würden.
Rocky Kev
34

Wie von @ andreas-hultgren in dieser Antwort und gemäß den npm-Dokumenten vorgeschlagen :

Wenn jemand vorhat, Ihr Modul in seinem Programm herunterzuladen und zu verwenden, möchte oder muss er das von Ihnen verwendete externe Test- oder Dokumentationsframework wahrscheinlich nicht herunterladen und erstellen.

Für die Webapp-Entwicklung platziert Yeoman (ein Gerüst-Tool, das unter anderem eine von Experten überprüfte, vorab geschriebene package.json-Datei installiert) alle Pakete in devDependencies und nichts in Abhängigkeiten, sodass die Verwendung von --save-deveine sichere Sache zu sein scheint Zumindest in der Webapp- Entwicklung.

wayfarer_boy
quelle
3
Beachten Sie, dass bei der Verwendung von gulp und der Installation von Paketen Probleme aufgetreten sind, bei --save-devdenen das Paket die erforderlichen Abhängigkeiten nicht installieren würde. Beim Ausführen wurden --savediese fehlenden Abhängigkeiten installiert.
Nick M
18
Ich möchte auch darauf hinweisen, dass ich jetzt --savealle außer Test- und Dokumentationsabhängigkeiten verwende (gemäß den npm-Dokumenten). Ich fange an zu denken, dass das oben erwähnte Yeoman-Beispiel kein gutes Beispiel für bewährte Verfahren ist.
wayfarer_boy
Ich denke auch, warum sollten Sie jemals brauchen, --save-devwird mit jeder Antwort hier nur weniger klar :)
Kokodoko
20

--save-devspeichert die Semver-Spezifikation im Array "devDependencies" in Ihrer Paketdeskriptordatei und --savespeichert sie stattdessen in "Abhängigkeiten".

Alex
quelle
83
und was ist der funktionale Unterschied?
Ahnbizcad
6
Diese Antwort ist für mich am sinnvollsten. DevDependencies sind dann für die Entwicklung erforderlich, aber nicht für die Produktion. Daher sind htmllint, sass compilation usw. und Dependencies für Produktionsanforderungen wie Diaporama erforderlich, die vorhanden sein müssen, damit die Dinge ausgeführt werden können.
Miller der Gorilla
3
@ahnbizcad Hier wird es besser beantwortet , aber der Hauptfunktionsunterschied besteht darin, dass devDependencies nicht transitiv eingeschlossen sind.
Pace
Ist dies nicht die intuitivste Art, es für jemanden zu beschreiben, der es noch nicht weiß?: Dev erstellt --save-devPakete lokal für Ihr Projekt, während --savesie lokal für Ihre Installation des Knotens sind.
Ahnbizcad
9

Klare Antworten sind bereits gegeben. Es ist jedoch erwähnenswert, wie sich dies devDependenciesauf die Installation von Paketen auswirkt:

Standardmäßig installiert npm install alle Module, die in package.json als Abhängigkeiten aufgeführt sind. Mit dem Flag --production (oder wenn die Umgebungsvariable NODE_ENV auf Produktion gesetzt ist) installiert npm keine in devDependencies aufgelisteten Module.

Siehe: https://docs.npmjs.com/cli/install

Alireza
quelle
8

Im Allgemeinen möchten Sie das Produktionspaket nicht mit Dingen aufblähen, die Sie nur für Entwicklungszwecke verwenden möchten.

Verwenden Sie die Option --save-dev(oder -D), um Pakete wie Unit-Test-Frameworks (Scherz, Jasmin, Mokka, Chai usw.) zu trennen.

Alle anderen Pakete, die Ihre App für die Produktion benötigt, sollten mit --save(oder -S) installiert werden .

npm install --save lodash       //prod dependency
npm install -S moment           // "       "
npm install -S opentracing      // "       "

npm install -D jest                 //dev only dependency
npm install --save-dev typescript   //dev only dependency

Wenn Sie die package.jsonDatei öffnen , werden diese Einträge in zwei verschiedenen Abschnitten aufgelistet:

"dependencies": {
  "lodash": "4.x",
  "moment": "2.x",
  "opentracing": "^0.14.1"
},

"devDependencies": {
    "jest": "22.x",
    "typescript": "^2.8.3"
},
Velhala
quelle
5

--save-dev wird für Module verwendet, die bei der Entwicklung der Anwendung verwendet werden und während der Ausführung in der Produktionsumgebung nicht erforderlich sind. --save wird zum Hinzufügen in package.json verwendet und ist für die Ausführung der Anwendung erforderlich.

Beispiel: Express, Body-Parser, Lodash, Helm, MySQL. Alle diese Funktionen werden beim Ausführen der Anwendung verwendet. Verwenden Sie diese Option, um Abhängigkeiten einzufügen, während Mokka, Istanbul, Chai und Sonarqube-Scanner während der Entwicklung verwendet werden -abhängigkeiten.

npm link oder npm install installiert auch die dev-Abhängigkeitsmodule zusammen mit den Abhängigkeitsmodulen in Ihrem Projektordner

Biswadev
quelle
3

Alle Erklärungen hier sind großartig, aber es fehlt eine sehr wichtige Sache: Wie installieren Sie nur Produktionsabhängigkeiten? (ohne die Entwicklungsabhängigkeiten). Wir trennen dependenciesvon devDependenciesdurch die Verwendung --saveoder --save-dev. Um alles zu installieren, was wir verwenden:

npm i

Um nur Produktionspakete zu installieren, sollten wir verwenden:

npm i --only=production
Ronny Sherer
quelle
0

Ich möchte einige meiner Ideen als hinzufügen

Ich denke, alle Unterschiede werden auftreten, wenn jemand Ihre Codes verwendet, anstatt sie selbst zu verwenden

Beispielsweise schreiben Sie eine HTTP-Bibliothek mit dem Namen node's request

In Ihrer Bibliothek,

Sie haben lodash verwendet, um Zeichenfolge und Objekt zu verarbeiten. Ohne lodash können Ihre Codes nicht ausgeführt werden

Wenn jemand Ihre HTTP-Bibliothek als Teil seiner Codes verwendet. Ihre Codes werden mit seinen zusammengestellt.

Ihre Codes benötigen lodash, also müssen Sie dependencieszum Kompilieren eingeben


Wenn Sie ein Projekt wie monaco-editoreinen Web-Editor schreiben ,

Sie haben alle Ihre Codes gebündelt und Ihre product env libraryVerwendung von Webpack, wenn die Erstellung abgeschlossen ist, haben nur einemonaco-min.js

Also macht jemand keinen Fall, ob --saveoder --save-dependencies, nur er brauchtmonaco-min.js

Zusammenfassung:

  1. Wenn jemand Ihre Codes kompilieren möchte (als Bibliothek verwenden), geben Sie lodashdie von Ihren Codes verwendeten eindependencies

  2. Wenn jemand Ihren Codes weitere Funktionen hinzufügen möchte, muss er diese eingeben unit testund compilereingebendev-dependencies

Toffee
quelle
0

Die Leute verwenden npm in der Produktion, um böse coole Sachen zu machen. Node.js ist ein Beispiel dafür, also möchten Sie nicht, dass alle Ihre Entwickler-Tools ausgeführt werden.

Wenn Sie gulp (oder ähnliches) verwenden, um Build-Dateien für Ihren Server zu erstellen, spielt dies keine Rolle.

Tristanisginger
quelle