wake-up-neo.com

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

Was ist der Unterschied zwischen: 

npm install [package_name] --save

und 

npm install [package_name] --save-dev

Was bedeutet das?

502
nfort
  • --save-dev wird verwendet, um das Paket für Entwicklungszwecke zu speichern .__ Beispiel: Komponententests, Minifizierung .. 
  • --save wird zum Speichern des für die Ausführung der Anwendung erforderlichen Pakets verwendet.
415
Tuong Le

Der Unterschied zwischen --save und --save-dev ist möglicherweise nicht sofort erkennbar, wenn Sie beide in Ihren eigenen Projekten versucht haben. Hier sind ein paar Beispiele ...

Nehmen wir an, Sie bauten eine App, die das moment - Paket verwendete, um Datumsangaben zu analysieren und anzuzeigen. Ihre App ist ein Scheduler, daher muss das Paket wirklich ausgeführt werden, da in: ohne es nicht ausgeführt werden kann. In diesem Fall würden Sie verwenden

npm install moment --save

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

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

Bei der Entwicklung ist es wirklich hilfreich, Tools wie Testsuites zu verwenden, und Jasmin-Core 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 erstellen

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

Sie brauchen die Testsuite nicht, um die App in ihrem normalen Status auszuführen. Es handelt sich also um eine --save-dev-Abhängigkeit, nichts weiter. Sie können sehen, dass es schwer vorstellbar ist, wenn Sie nicht verstehen, was wirklich passiert.

Direkt aus NPM docs docs # dependencies übernommen

Abhängigkeiten

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

Bitte setzen Sie keine Testkabelbäume oder Transpiler in Ihre Abhängigkeiten Objekt. Siehe devDependencies unten.

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

Ich hoffe das hilft und ist klar.

444
Michael Bruce

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 sie zuerst installieren und dann dem Abschnitt dependencies Ihres package.json hinzufügen.

--save-dev fügt das Drittanbieterpaket zu den Entwicklungsabhängigkeiten des Pakets hinzu. Es wird nicht installiert, wenn jemand Ihr Paket installiert. Es wird normalerweise nur installiert, wenn jemand clones Ihr Quell-Repository verwendet und darin npm install ausführt.

--save fügt das Paket des Drittanbieters den Abhängigkeiten des Pakets hinzu. Es wird zusammen mit dem Paket installiert, wenn jemand npm install package ausführt.

Dev-Abhängigkeiten sind Abhängigkeiten, die nur zum Entwickeln des Pakets benötigt werden. Dies kann Testläufer, Compiler, Paketierer usw. umfassen .. Beide Arten von Abhängigkeiten werden in der package.json-Datei des Pakets gespeichert. --save fügt dependencies hinzu, --save-dev fügt devDependencies hinzu

npm install Dokumentation kann hier referenziert werden.

66

Ein perfektes Beispiel dafür ist:

$ npm install TypeScript --save-dev

In diesem Fall möchten Sie TypeScript (eine durch Javascript analysierbare Programmiersprache) für die Entwicklung verfügbar machen. Sobald die App implementiert ist, ist dies jedoch nicht mehr erforderlich, da der gesamte Code in Javascript umgewandelt wurde. Daher wäre es nicht sinnvoll, sie in die veröffentlichte App aufzunehmen. In der Tat würde dies nur Speicherplatz in Anspruch nehmen und die Downloadzeiten erhöhen.

39
Jackalope

Wie von @ andreas-hultgren in diese Antwort vorgeschlagen und entsprechend den npm docs :

Wenn jemand plant, Ihr Modul herunterzuladen und in seinem Programm zu verwenden, möchte oder will es wahrscheinlich nicht das von Ihnen verwendete externe Test- oder Dokumentations-Framework herunterladen und erstellen.

Für die Entwicklung von Webapps platziert Yeoman (ein Gerüsttool, das unter anderem eine Peer-Review-vorgefertigte package.json-Datei installiert) alle Pakete in devDependencies und nichts in Abhängigkeiten --save-dev ist zumindest in der webapp - Entwicklung eine sichere Sache.

32
wayfarer_boy

--save-dev speichert die Semver-Spezifikation im Array "devDependencies" in Ihrer Paketbeschreibungsdatei. --save speichert sie stattdessen in "Abhängigkeiten".

17
alex

Lassen Sie mich Ihnen ein Beispiel geben,

  • Sie sind Entwickler einer sehr ERNSTnpmBibliothek. Welche 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 jest zum Testen und sie verwenden mocha. Möchten Sie, dass sie auch jest installieren? Um nur dein Lirary zu leiten?

Kein Recht? Deshalb sind sie in devDependencies.

Wenn jemand dies tut, npm i yourPackage werden nur die Bibliotheken installiert, die für RUN Ihre Bibliothek erforderlich sind.

Also, Warum müssen die Entwickler die devDependancies verfügbar machen?

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 Ihr Repo git clone und wenn sie einen npm i machen, die Abhängigkeiten sowie devDependencies. Weil sie Ihr Paket nicht benutzen. Sie entwickeln das Paket weiter, daher werden die devDependencies benötigt.

5

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

Beispiel: express, body-parser, lodash, helm, mysql. All diese werden während der Ausführung der Anwendung verwendet. UseSave speichert Abhängigkeiten, während Mocha, Istanbul, Chai, Sonarqube-Scanner während der Entwicklung verwendet werden -abhängigkeiten.

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

4
BittuS

Klare Antworten sind bereits vorhanden. Es sollte jedoch erwähnt werden, wie sich devDependencies auf 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 production gesetzt ist) werden von npm keine in devDependencies aufgelisteten Module installiert.

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

4
Alireza

Im Allgemeinen möchten Sie das Produktionspaket nicht mit Dingen aufblähen, die Sie nur für Entwicklungszwecke verwenden möchten. Verwenden Sie daher die Option --save-dev (oder -D), um diese Pakete wie Watchers (nodemon), Unit-Test-Frameworks (Jest, Jasmin, Mocha, Chai usw.) zu trennen. 

Alle anderen Bibliothekspakete, die für die Funktion Ihrer App erforderlich sind, müssen 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.json-Datei öffnen, werden diese Einträge in zwei verschiedenen Abschnitten aufgeführt:

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

"devDependencies": {
    "jest": "22.x",
    "TypeScript": "^2.8.3"
},
2
velhala

Ich möchte einige meiner Ideen hinzufügen 

Ich denke, alle Unterschiede werden auftauchen, wenn jemand Ihre Codes anstelle von sich selbst verwendet

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

In Ihrer Bibliothek 

sie haben lodash verwendet, um String und Objekte zu behandeln. Ohne lodash können Ihre Codes nicht ausgeführt werden

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

ihre Codes brauchen lodash, also müssen Sie dependencies eingeben, um zu kompilieren


Wenn Sie ein Projekt wie monaco-editor schreiben, das ein Webeditor ist,

sie haben alle Ihre Codes und Ihren product env library mit Webpack gebündelt. Wenn der Build abgeschlossen ist, haben Sie nur einen monaco-min.js

So kann jemand nicht sagen, ob --save oder --save-dependencies, er braucht nur monaco-min.js

Zusammenfassung:

  1. Wenn jemand Ihre Codes zusammenstellen möchte (als Bibliothek verwenden), setzen Sie lodash, die von Ihren Codes verwendet wird, in dependencies

  2. Wenn jemand weitere Funktionen zu Ihren Codes hinzufügen möchte, benötigt er unit test und compiler. Geben Sie diese in dev-dependencies ein.

0
toffee

npm install speichert alle angegebenen Pakete standardmäßig in Abhängigkeiten. Außerdem können Sie mit einigen zusätzlichen Flags steuern, wo und wie sie gespeichert werden:

-P, --save-prod: Das Paket wird in Ihren Abhängigkeiten angezeigt. Dies ist die Standardeinstellung, sofern nicht -D oder -O vorhanden sind.

-D, --save-dev: Paket wird in Ihrer devDependencies angezeigt.

-O, --save-optional:-Paket wird in Ihren optionalen Abhängigkeiten angezeigt.

--no-save: Verhindert das Speichern in Abhängigkeiten .

Wenn Sie eine der obigen Optionen verwenden, um Abhängigkeiten in Ihrer package.json zu speichern, gibt es zwei zusätzliche optionale Flags:

-E, --save-exact: Gespeicherte Abhängigkeiten werden mit einer genauen Version konfiguriert, anstatt den standardmäßigen Semmer-Bereichsoperator von npm zu verwenden.

-B, --save-bundle: Gespeicherte Abhängigkeiten werden auch zu Ihrer Liste bundleDependencies hinzugefügt.

0
hakiko

Die Leute benutzen npm in der Produktion, um coole Sachen zu machen. Node.js ist ein Beispiel dafür, also wollen Sie nicht, dass all Ihre Entwickler-Tools ausgeführt werden.

Wenn Sie gulp (oder ähnliches) verwenden, um Build-Dateien zu erstellen, die auf Ihrem Server abgelegt werden sollen, spielt dies keine Rolle.

0
Tristanisginger