Riepilogo di importanti differenze comportamentali:
Opzioni correlate non discusse qui:
devDependencies
dependencies
sono necessari per l'esecuzione, devDependencies
solo per lo sviluppo, ad esempio: unit test, conversione da CoffeeScript a JavaScript, minificazione, ...
Se hai intenzione di sviluppare un pacchetto, lo scarichi (ad es. Via git clone
), vai alla sua radice che contiene package.json
ed esegui:
npm install
Dal momento che hai la fonte reale, è chiaro che vuoi svilupparla, quindi per impostazione predefinita, sono installati sia dependencies
(poiché, ovviamente, devi correre per sviluppare) sia le devDependency
dipendenze.
Se tuttavia, sei solo un utente finale che desidera semplicemente installare un pacchetto per usarlo, lo farai da qualsiasi directory:
npm install "$package"
In questo caso, normalmente non si desidera che le dipendenze di sviluppo, quindi basta avere ciò che è necessario per utilizzare il pacchetto: dependencies
.
Se vuoi davvero installare i pacchetti di sviluppo in quel caso, puoi impostare l' dev
opzione di configurazione su true
, possibilmente dalla riga di comando come:
npm install "$package" --dev
L'opzione è false
di default poiché questo è un caso molto meno comune.
peerDependencies
(Testato prima di 3.0)
Fonte: https://nodejs.org/en/blog/npm/peer-dependencies/
Con le dipendenze regolari, è possibile avere più versioni della dipendenza: è semplicemente installata all'interno node_modules
della dipendenza.
Ad esempio, se dependency1
e dependency2
entrambi dipendono dependency3
in diverse versioni ad albero del progetto sarà simile:
root/node_modules/
|
+- dependency1/node_modules/
| |
| +- dependency3 v1.0/
|
|
+- dependency2/node_modules/
|
+- dependency3 v2.0/
I plug-in, tuttavia, sono pacchetti che normalmente non richiedono l'altro pacchetto, chiamato host in questo contesto. Anziché:
- i plugin sono richiesti dall'host
- i plugin offrono un'interfaccia standard che l'host si aspetta di trovare
- solo l'host verrà chiamato direttamente dall'utente, quindi deve esserci una sola versione di esso.
Ad esempio, se dependency1
e dependency2
peer dipendono dependency3
, l'albero del progetto sarà simile a:
root/node_modules/
|
+- dependency1/
|
+- dependency2/
|
+- dependency3 v1.0/
Questo succede anche se non hai mai menzionato dependency3
nel tuo package.json
file.
Penso che questa sia un'istanza del modello di progettazione di Inversion of Control .
Un esempio prototipico di dipendenze tra pari è Grunt, l'host e i suoi plugin.
Ad esempio, su un plug-in Grunt come https://github.com/gruntjs/grunt-contrib-uglify , vedrai che:
grunt
è un peer-dependency
- l'unico
require('grunt')
è sotto tests/
: non è effettivamente utilizzato dal programma.
Quindi, quando l'utente utilizzerà un plugin, richiederà implicitamente il plugin Gruntfile
aggiungendo una grunt.loadNpmTasks('grunt-contrib-uglify')
linea, ma è grunt
che l'utente chiamerà direttamente.
Questo non funzionerebbe quindi se ogni plugin richiedesse una versione di Grunt diversa.
Manuale
Penso che la documentazione risponda abbastanza bene alla domanda, forse non hai abbastanza familiarità con i gestori di nodi / altri pacchetti. Probabilmente lo capisco solo perché conosco un po 'il bundler di Ruby.
La linea chiave è:
Queste cose verranno installate quando si esegue npm link o npm install dalla radice di un pacchetto e possono essere gestite come qualsiasi altro parametro di configurazione npm. Vedi npm-config (7) per ulteriori informazioni sull'argomento.
E poi sotto npm-config (7) trova dev
:
Default: false
Type: Boolean
Install dev-dependencies along with packages.
optionalDependencies
ora.