Qual'è la differenza tra --save e --save-dev?


747

Qual è la differenza tra:

npm install [package_name] --save

e:

npm install [package_name] --save-dev

Cosa significa questo?


4
sì, ne sono confuso - se usi l'integrazione continua come Jenkins, Jenkins sa di usare i moduli devDependencies per eseguire i test? Suppongo di sì, ma non è super ovvio.
Alexander Mills,

5
magari modificare la domanda per dire anche: qual è la differenza funzionale tra dipendenze e devDependencies?
Alexander Mills,

5
I pacchetti installati tramite l'opzione --save-dev non vengono reinstallati quando l'utente esegue npm install --production. Questa è la differenza operativa (vedi https://docs.npmjs.com/cli/install per maggiori informazioni).
Andrew,

7
@MuhammadUmer Questo è esattamente il motivo per cui le persone fanno domande qui - al fine di "avere un'idea". Forse aggiungere una risposta reale sarebbe più produttivo - questa è sicuramente una distinzione interessante di cui non ero a conoscenza.
Simon_Weaver

3
anche se si imposta la variabile d'ambiente NODE_ENVsu produzione, quindi npm installsi escludono automaticamente i pacchetti di sviluppo.
Muhammad Umer,

Risposte:


591
  • --save-devviene utilizzato per salvare il pacchetto a scopo di sviluppo. Esempio: unit test, minificazione ..
  • --save viene utilizzato per salvare il pacchetto richiesto per l'esecuzione dell'applicazione.

150
Come sono differenti? Quando dovrei usare l'uno contro l'altro? Posso ancora usare il pacchetto in produzione se è sotto --save-dev?
Dave Voyles, l'

14
La risposta risponde in modo succinto alle tue prime due domande. La risposta all'ultima domanda, "Posso ancora usare il pacchetto in produzione se è sotto --save-dev" è "no". Sebbene sia certamente possibile farlo, non è previsto.
Technetium,

61
Versioni stenografiche: -Dè l'abbreviazione di --save-deved -Sè l'abbreviazione di--save
chrisco

164
Questa risposta è frustrantemente vaga. Anche un piccolo esempio contribuirebbe a rendere questo più chiaro.
Choylton B. Higginbottom,

33
Da npm versione 5.0.0, l' --saveopzione non è più necessaria. In tal caso npm install my-package, verrà aggiunto "my-package" come dipendenza nel file package.json.
Martin Carel,

644

La differenza tra --savee --save-devpotrebbe non essere immediatamente evidente se le hai provate entrambe sui tuoi progetti. Quindi, ecco alcuni esempi ...

Diciamo che stavi costruendo un'app che utilizzava il pacchetto moment per analizzare e visualizzare le date. La tua app è uno scheduler, quindi ha davvero bisogno che questo pacchetto funzioni, come in: non può funzionare senza di essa . In questo caso useresti

npm install moment --save

Ciò creerebbe un nuovo valore in package.json

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

Quando stai sviluppando, aiuta davvero ad usare strumenti come test suite e potrebbe aver bisogno di jasmine-core e karma . In questo caso useresti

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

Ciò creerebbe anche un nuovo valore in package.json

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

Non è necessaria la suite di test per eseguire l'app nel suo stato normale, quindi è una --save-devdipendenza dal tipo, niente di più. Puoi vedere come se non capisci cosa sta realmente accadendo, è un po 'difficile da immaginare.

Tratto direttamente dai documenti NPM # dipendenze

dipendenze

Le dipendenze sono specificate in un oggetto semplice che associa il nome di un pacchetto a un intervallo di versioni. L'intervallo di versioni è una stringa che ha uno o più descrittori separati da spazi. Le dipendenze possono anche essere identificate con un tarball o un URL git.

Non inserire cablaggi di prova o transpiler nell'oggetto delle dipendenze. Vedi devDependencies , di seguito.

Anche nei documenti, ti chiede di usare --save-dev per moduli come i cablaggi di prova.

Spero che questo aiuti ed sia chiaro.


15
IMO, penso che la parola chiave "salva" sia un problema. Perché non fanno -dev flag per lo sviluppo e -deploy per la distribuzione. Ha senso che la parola chiave "salva".
Thinh Vu,

1
Perché il pacchetto non sa (decide) se è un pacchetto di rilascio o un pacchetto di sviluppo e --save essere usato per entrambi. Sembra strano far decidere all'utente di installazione quando lo sviluppatore del pacchetto crea l'intento.
CodeGrue

4
CodeGrue, se usi jQuery solo per testare i componenti di React andrebbe in save-dev, ma potresti non usarlo per costruire il tuo progetto principale. Sì, questo è possibile. Quindi perché il packager dovrebbe sapere cosa ci fai?
Michael Bruce,

2
Molto più chiaro Sono un ragazzo incorporato che impara per la prima volta il flusso di lavoro Bootstra + Node.js. Non è ovvio quale sia la differenza rispetto al bracciale.
Leroy105,

3
@YakovL save-dev significa che i pacchetti non sono installati quando qualcun altro installa il tuo pacchetto come propria dipendenza. I pacchetti che vengono utilizzati solo per eseguire script come start / build non saranno necessari in quel caso, quindi vengono inseriti in dipendenze dev. Se stai lavorando su un'app Web e non su un pacchetto utilizzato da altri, probabilmente non dovresti preoccuparti affatto.
riv

112

Per impostazione predefinita, NPM installa semplicemente un pacchetto in node_modules. Quando stai cercando di installare dipendenze per la tua app / modulo, dovresti prima installarli e quindi aggiungerli alla dependenciessezione della tua package.json.

--save-devaggiunge il pacchetto di terze parti alle dipendenze di sviluppo del pacchetto. Non verrà installato quando qualcuno installa il tuo pacchetto. In genere viene installato solo se qualcuno clona il repository di origine e vi esegue npm install.

--saveaggiunge il pacchetto di terze parti alle dipendenze del pacchetto. Verrà installato insieme al pacchetto ogni volta che qualcuno esegue npm install package.

Le dipendenze degli sviluppatori sono quelle dipendenze necessarie solo per lo sviluppo del pacchetto. Ciò può includere test runner, compilatori, packager, ecc. Entrambi i tipi di dipendenze sono memorizzati nel package.jsonfile del pacchetto . --saveaggiunge a dependencies, --save-devaggiunge adevDependencies

La documentazione per l' installazione di npm è disponibile qui.


37
Ho sospettato questo ... puoi usare --save-dev e --save in modo intercambiabile se stai costruendo un'app web che non diventerà un pacchetto cioè scaricato da npm, se stai sviluppando un pacchetto da condividere con altri è importante capire la differenza.
VFein

13
Grazie finalmente qualcuno che dice il suo scopo quando si utilizza npm install
CapturedTree

3
--save è ora predefinito con l'installazione di npm con il rilascio di npm 5 nel 2017
NattyC

aspetta, perché frasi complesse? In DevDependecy lo sviluppatore può installare i pacchetti e verrà aggiornato solo devDevependency. Quindi quando un nuovo sviluppatore clona la base di codice del progetto ed esegue npm install => qui solo dependency package name is going to install.in node_modules .. non nel pacchetto dello sviluppatore come in Dev-dependency.
Anupam Maurya,

60

Un esempio perfetto di questo è:

$ npm install typescript --save-dev

In questo caso, dovresti avere Typescript (un linguaggio di codifica analizzabile con javascript) disponibile per lo sviluppo, ma una volta distribuita l'app, non è più necessaria, poiché tutto il codice è stato trasferito in javascript. Pertanto, non avrebbe senso includerlo nell'app pubblicata. In effetti, occuperebbe solo spazio e aumenterebbe i tempi di download.


4
Lo stesso vale per: "$ npm install grunt --save-dev", poiché è utile per lo sviluppo, ma non per la distribuzione.
Jackalope,

1
Una nota a margine: Microsoft suggerisce di installare pacchetti @ types / xxx come dipendenze, non devDependencies github.com/Microsoft/types-publisher/issues/81
Dave,

2
Ciò che trovo confuso è come importa anche questo? I pacchetti salvati utilizzando --savevengono comunque salvati solo nella node_modulescartella. Il codice non è incluso nel sito Web distribuito.
Kokodoko,

6
@Kokodoko Quando usi la --save-devbandiera, il pacchetto viene aggiunto al tuo devDependenciesoggetto. Se / quando qualcuno installa il tuo pacchetto, tutti dependenciesvengono scaricati ma non lo devDependenciessono, poiché non sono richiesti in fase di esecuzione. Come affermato nella risposta, ciò consente di risparmiare tempo e spazio. Gli sviluppatori che lavorano sui file del pacchetto stesso possono semplicemente eseguire npm installall'interno della directory del pacchetto per installare devDependenciesanche.
Jasjit Singh Marwah,

Quindi, se scarichi un repository da github e digiti npm install, devDependenciesvengono ignorati?
Kokodoko,

41

Lasciate che vi faccia un esempio,

  • Sei uno sviluppatore di una libreria npm molto SERIA . Che utilizza diverse librerie di test per testare il pacchetto.
  • Un utente ha scaricato la tua libreria e desidera utilizzarla nel proprio codice. Devono scaricare anche le tue librerie di test? Forse usi jestper i test e loro usano mocha. Vuoi che anche loro installino jest? Solo per gestire la tua biblioteca?

Nessun diritto? Ecco perché sono dentro devDependencies.

Quando qualcuno fa, npm i yourPackagesolo le librerie necessarie per RUN tua libreria verranno installati. Le altre librerie utilizzate per raggruppare il codice o testare e deridere non verranno installate perché inserite devDependencies. Abbastanza pulito vero?

Quindi, perché gli sviluppatori devono esporre le devDependancies ?

Supponiamo che il tuo pacchetto sia un pacchetto open source e che centinaia di persone stiano inviando richieste pull al tuo pacchetto. Quindi come testeranno il pacchetto? Saranno il git clonetuo repository e quando farebbero npm ile dipendenze e devDependencies .
Perché non stanno usando il tuo pacchetto. Stanno sviluppando ulteriormente il pacchetto, quindi, per testare il pacchetto devono superare i casi di test esistenti e scrivere nuovi. Quindi, devono usare le tue devDependenciesche contengono tutte le librerie di testing / building / beffardo che hai usato.


8
Molto meglio della risposta accettata e della risposta con il massimo dei voti in quanto questa risposta è di natura più pratica. Grazie!
Eccezione non rilevata

Questa dovrebbe essere la risposta scelta. Tutte le altre risposte non spiegano davvero PERCHÉ dovresti usare l'una sull'altra.
Rocky Kev,

34

Come suggerito da @ andreas-hultgren in questa risposta e secondo i documenti di npm :

Se qualcuno sta pianificando di scaricare e utilizzare il modulo nel proprio programma, probabilmente non vuole o non ha bisogno di scaricare e costruire il test esterno o il framework di documentazione che usi.

Tuttavia, per lo sviluppo di webapp, Yeoman (uno strumento di impalcatura che installa un file package.json pre-scritto, peer-reviewed, tra le altre cose) colloca tutti i pacchetti in devDependencies e nulla in dipendenze, quindi sembra che l'uso di --save-devsia una scommessa sicura nello sviluppo di webapp , almeno.


3
Si noti che ho riscontrato problemi durante l'utilizzo di gulp e l'installazione di pacchetti in --save-devcui il pacchetto non installava le dipendenze richieste. In esecuzione --saveinstallato quelle dipendenze mancanti.
Nick M

18
Vorrei anche notare che ora sto usando --saveper tutte le dipendenze di test e documentazione (come per i documenti npm). Sto iniziando a pensare che l'esempio Yeoman che ho menzionato sopra non sia un buon esempio di buone pratiche.
wayfarer_boy

Lo penso anche io, perché mai avresti bisogno --save-devsta diventando sempre meno chiaro con ogni risposta qui :)
Kokodoko

20

--save-devsalva le specifiche semver nell'array "devDependencies" nel file descrittore del pacchetto, invece le --savesalva in "dipendenze".


83
e qual è la differenza funzionale?
ahnbizcad,

6
questa risposta ha più senso per me, quindi le devDependencies sono richieste per lo sviluppo ma non per la produzione, quindi htmllint, sass compilation ecc. e le dipendenze sono per i requisiti di produzione, come Diaporama che dovrà essere presente per far funzionare le cose.
Mugnai il gorilla il

3
@ahnbizcad Qui si risponde meglio , ma la principale differenza funzionale è che devDependencies non è inclusa in modo transitorio.
Pace,

Questo non è il modo più intuitivo per descriverlo per qualcuno che non lo sa già, questo ?: Dev --save-devrende i pacchetti locali per il tuo progetto, mentre --saveli rende locali per la tua installazione di nodo?
ahnbizcad,

9

Risposte chiare sono già fornite. Ma vale la pena ricordare come devDependenciesinfluisce l'installazione dei pacchetti:

Per impostazione predefinita, npm install installa tutti i moduli elencati come dipendenze in package.json. Con il flag --production (o quando la variabile d'ambiente NODE_ENV è impostata su produzione), npm non installerà i moduli elencati in devDependencies.

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


8

In genere non si desidera gonfiare il pacchetto di produzione con elementi che si intende utilizzare solo a scopo di sviluppo.

Utilizzare --save-dev(o -D) l'opzione per separare pacchetti come framework di unit test (jest, jasmine, mocha, chai, ecc.)

Tutti gli altri pacchetti necessari per la tua app per la produzione devono essere installati utilizzando --save(o -S).

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

Se apri il package.jsonfile, vedrai queste voci elencate in due diverse sezioni:

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

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

5

--save-dev viene utilizzato per i moduli utilizzati nello sviluppo dell'applicazione, non è necessario durante l'esecuzione nell'ambiente di produzione --save viene utilizzato per aggiungerlo in package.json ed è necessario per l'esecuzione dell'applicazione.

Esempio: express, body-parser, lodash, helmet, mysql tutti questi sono usati durante l'esecuzione dell'applicazione usa --save per mettere dipendenze mentre moka, istanbul, chai, sonarqube-scanner sono tutti usati durante lo sviluppo, quindi metti quelli in dev -dipendenze.

npm link o npm install installerà anche i moduli di dipendenza dev insieme ai moduli di dipendenza nella cartella del progetto


3

Tutte le spiegazioni qui sono ottime, ma mancano di una cosa molto importante: come si installano solo le dipendenze di produzione? (senza le dipendenze di sviluppo). Separiamo dependenciesda devDependenciestramite --saveo --save-dev. Per installare tutto ciò che utilizziamo:

npm i

Per installare solo pacchetti di produzione dovremmo usare:

npm i --only=production

0

Voglio aggiungere alcune mie idee come

Penso che tutte le differenze appariranno quando qualcuno usa i tuoi codici invece di usarli da solo

Ad esempio, scrivi una libreria HTTP chiamata node's request

Nella tua biblioteca,

hai usato lodash per gestire stringhe e oggetti, senza lodash, i tuoi codici non possono essere eseguiti

Se qualcuno usa la tua libreria HTTP come parte dei suoi codici. I tuoi codici saranno compilati con i suoi.

i tuoi codici hanno bisogno di lodash, quindi devi metterli dependenciesper la compilazione


Se scrivi un progetto come monaco-editor, che è un editor web,

hai raggruppato tutti i tuoi codici e il tuo product env libraryutilizzo del webpack, una volta completata la compilazione, hai solo unmonaco-min.js

Quindi qualcuno non capisce se --saveo --save-dependencies, solo lui ne abbia bisognomonaco-min.js

Sommario:

  1. Se qualcuno vuole compilare i tuoi codici (utilizzare come libreria), inserisci quello lodashutilizzato dai tuoi codici independencies

  2. Se qualcuno vuole aggiungere più funzionalità ai tuoi codici, ha bisogno unit teste compiler, inseriscilidev-dependencies


0

Le persone usano npm in produzione per fare cose fantastiche, Node.js ne è un esempio, quindi non vuoi che tutti i tuoi strumenti di sviluppo vengano eseguiti.

Se stai usando gulp (o simile) per creare file di build da mettere sul tuo server, non importa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.