Résumé des différences de comportement importantes :
Options connexes non abordées ici :
devDependencies
dependencies
sont nécessaires pour fonctionner, devDependencies
uniquement pour développer, par exemple : tests unitaires, transpilation de CoffeeScript en JavaScript, minification, ...
Si vous allez développer un paquet, vous le téléchargez (par exemple via git clone
), allez à sa racine qui contient package.json
et exécuter :
npm install
Puisque vous avez la source réelle, il est clair que vous voulez la développer, donc par défaut, les deux dependencies
(puisqu'il faut, bien sûr, courir pour développer) et devDependency
sont également installées.
Si toutefois, vous n'êtes qu'un utilisateur final qui souhaite simplement installer un paquet pour l'utiliser, vous le ferez à partir de n'importe quel répertoire :
npm install "$package"
Dans ce cas, vous ne voulez normalement pas les dépendances de développement, vous obtenez donc juste ce qui est nécessaire pour utiliser le paquet : dependencies
.
Si vous voulez vraiment installer les paquets de développement dans ce cas, vous pouvez définir l'option dev
option de configuration pour true
éventuellement à partir de la ligne de commande comme :
npm install "$package" --dev
L'option est false
par défaut, car il s'agit d'un cas beaucoup moins fréquent.
peerDependencies
(Testé avant 3.0)
Source : https://nodejs.org/en/blog/npm/peer-dependencies/
Avec les dépendances normales, vous pouvez avoir plusieurs versions de la dépendance : elle est simplement installée à l'intérieur de la section node_modules
de la dépendance.
Par exemple, si dependency1
et dependency2
dépendent tous deux de dependency3
à différentes versions, l'arbre du projet ressemblera à ceci :
root/node_modules/
|
+- dependency1/node_modules/
| |
| +- dependency3 v1.0/
|
|
+- dependency2/node_modules/
|
+- dependency3 v2.0/
Les plugins, quant à eux, sont des paquets qui ne nécessitent normalement pas l'autre paquet, qui est appelé le hôte dans ce contexte. Au lieu de cela :
- les plugins sont nécessaires par l'hôte
- les plugins offrent une interface standard que l'hôte s'attend à trouver
- seul l'hôte sera appelé directement par l'utilisateur, il doit donc y avoir une seule version de celui-ci.
Par exemple, si dependency1
et dependency2
pairs dépendent de dependency3
l'arbre du projet ressemblera à ceci :
root/node_modules/
|
+- dependency1/
|
+- dependency2/
|
+- dependency3 v1.0/
Cela arrive même si vous ne mentionnez jamais dependency3
dans votre package.json
fichier.
Je pense que c'est un exemple de la Inversion du contrôle modèle de conception.
Un exemple prototypique de dépendances entre pairs est Grunt, l'hôte, et ses plugins.
Par exemple, sur un plugin Grunt comme https://github.com/gruntjs/grunt-contrib-uglify vous le verrez :
-
grunt
est un peer-dependency
- le seul
require('grunt')
est sous tests/
: il n'est pas réellement utilisé par le programme.
Ensuite, lorsque l'utilisateur utilisera un plugin, il exigera implicitement le plugin de la base de données de l'utilisateur. Gruntfile
en ajoutant un grunt.loadNpmTasks('grunt-contrib-uglify')
ligne, mais c'est grunt
que l'utilisateur appellera directement.
Cela ne fonctionnerait pas alors si chaque plugin nécessitait une version différente de Grunt.
Manuel
Je pense que la documentation répond assez bien à la question, peut-être que vous n'êtes tout simplement pas assez familier avec node / d'autres gestionnaires de paquets. Je ne le comprends probablement que parce que je connais un peu le bundler de Ruby.
La ligne clé est :
Ces éléments seront installés lors de l'exécution de npm link ou npm install à partir de la racine d'un paquet et peuvent être gérés comme tout autre paramètre de configuration de npm. Voir npm-config(7) pour plus d'informations sur le sujet.
Et ensuite sous npm-config(7) trouvez dev
:
Default: false
Type: Boolean
Install dev-dependencies along with packages.
80 votes
Notez qu'il existe également
optionalDependencies
maintenant.337 votes
AidanFeldman "optionalDependencies" est mon oxymore du jour.
6 votes
La documentation de npm dit : "dependencies" : Paquets requis par votre application en production. "devDependencies" : Les paquets qui ne sont nécessaires que pour le développement et les tests locaux. voir le lien : docs.npmjs.com/
0 votes
Les dépendances sont les références des paquets utilisés par votre bibliothèque sans lesquels elle ne peut pas fonctionner et qui doivent être installées automatiquement avec l'installation de votre bibliothèque. En regardant peerDependencies, npm enverra simplement un message d'avertissement si les paquets spécifiés ne sont pas trouvés dans les modules node. Il n'installera aucun paquet pour vous. Pour une explication détaillée, reportez-vous au lien : medium.com/p/16f43d6c7e45