Détails
Quelle est la différence entre les dépendances, devDependencies et peerDependencies dans le fichier npm package.json ?
[Cette documentation][1] répond très mal à ma question. Je n’ai pas compris ces explications. Quelqu'un peut-il me répondre avec des mots plus simples ? Peut-être avec des exemples si c’est difficile de choisir des mots simples ?
EDIT J'ai également ajouté peerDependencies
, qui est étroitement lié et peut prêter à confusion.
1869
3
Résumé des différences de comportement importantes :
dépendances
][1] sont installées sur les deux :npm install
depuis un répertoire qui contientpackage.json
npm install $package
dans tout autre répertoire.devDependencies
][2] sont :npm install
sur un répertoire contenantpackage.json
, sauf si vous passez le drapeau--production
(allez upvotez la réponse de Gayan Charith).npm install "$package"
sur un autre répertoire, sauf si vous lui donnez l'option--dev
.peerDependencies
][4] :npm install
, et vous devez résoudre la dépendance vous-même manuellement. Lors de l'exécution, si la dépendance est manquante, vous obtenez une erreur (mentionné par [@nextgentech][6]).dependencies
sont installées de manière transitive : si A nécessite B, et que B nécessite C, alors C est installé, sinon, B ne pourrait pas fonctionner, et A non plus.devDependencies
n'est pas installé de manière transitive. Par exemple, nous n'avons pas besoin de tester B pour tester A, donc les dépendances de test de B peuvent être laissées de côté. Options connexes non discutées ici :bundledDependencies
qui est discuté à la question suivante : https://stackoverflow.com/questions/11207638/advantages-of-bundleddependencies-over-normal-dependencies-in-npm?lq=1optionalDependencies
][8] (mentionné [par Aidan Feldman][9])devDependencies
Les
dependencies
sont nécessaires à l'exécution, lesdevDependencies
uniquement au développement, par exemple : tests unitaires, transpilation CoffeeScript vers JavaScript, minification, ... Si vous allez développer un paquet, vous le téléchargez (par exemple viagit clone
), allez à sa racine qui contientpackage.json
, et exécutez :Puisque vous avez la source réelle, il est clair que vous voulez la développer, donc par défaut, les deux dépendances
dependencies
(puisque vous devez, bien sûr, exécuter pour développer) etdevDependency
sont également installées. Si toutefois, vous n'êtes qu'un utilisateur final qui veut juste installer un paquetage pour l'utiliser, vous le ferez depuis n'importe quel répertoire :Dans ce cas, vous ne voulez normalement pas les dépendances de développement, donc vous obtenez 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 mettre l'option de configurationdev
àtrue
, éventuellement à partir de la ligne de commande comme :L'option est
false
par défaut car c'est 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 : elles sont simplement installées dans les
node_modules
de la dépendance. Par exemple, sidependency1
etdependency2
dépendent tous les deux dedependency3
à des versions différentes, l'arbre du projet ressemblera à ça :Les plugins, cependant, sont des paquets qui normalement ne nécessitent pas l'autre paquet, qui est appelé le host dans ce contexte. Au contraire :
dependency1
etdependency2
dépendent dedependency3
, l'arbre du projet ressemblera à :Cela se produit même si vous ne mentionnez jamais
dependency3
dans votre fichierpackage.json
. Je pense qu'il s'agit d'une instance du modèle de conception [Inversion of Control][10]. 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 verrez que :grunt
est unepeer-dependency
(dépendance entre pairs)require('grunt')
est soustests/
: il n'est pas réellement utilisé par le programme. Ensuite, lorsque l'utilisateur utilisera un plugin, il requerra implicitement le plugin depuis leGruntfile
en ajoutant une lignegrunt.loadNpmTasks('grunt-contrib-uglify')
, mais c'estgrunt
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 pas assez familier avec node / autres gestionnaires de paquets. Je ne le comprends probablement que parce que je connais un peu Ruby bundler. La ligne clé est :
[1] : https://github.com/npm/npm/blob/2e3776bf5676bc24fec6239a3420f377fe98acde/doc/files/package.json.md#dependencies [2] : https://github.com/npm/npm/blob/2e3776bf5676bc24fec6239a3420f377fe98acde/doc/files/package.json.md#devdependencies
[4] : https://github.com/npm/npm/blob/2e3776bf5676bc24fec6239a3420f377fe98acde/doc/files/package.json.md#peerdependencies
[6] : https://stackoverflow.com/users/1997767/nextgentech [7] : https://stackoverflow.com/questions/18875674/whats-the-difference-between-dependencies-devdependencies-and-peerdependencies/22004559#comment57650997_22004559 [8] : https://docs.npmjs.com/files/package.json#optionaldependencies [9] : https://stackoverflow.com/questions/18875674/whats-the-difference-between-dependencies-devdependencies-and-peerdependencies/22004559#comment62749434_18875674 [10] : http://en.wikipedia.org/wiki/Inversion_of_control
Par exemple, mocha serait normalement une devDependency, puisque les tests ne sont pas nécessaires en production, alors qu'express serait une dependency.
Il existe des modules et des paquets nécessaires uniquement pour le développement, qui ne sont pas nécessaires en production. Comme il est dit dans la [documentation][1] :
[1] : https://npmjs.org/doc/json.html#devDependencies