Cette documentation répond très mal à ma question. Je n'ai pas compris ces explications. Quelqu'un peut-il dire en termes plus simples? Peut-être avec des exemples s'il est difficile de choisir des mots simples?
EDIT a également ajouté peerDependencies
, qui est étroitement lié et pourrait prêter à confusion.
optionalDependencies
maintenant.Réponses:
Résumé des différences de comportement importantes:
dependencies
sont installés sur les deux:npm install
à partir d'un répertoire qui contientpackage.json
npm install $package
sur tout autre répertoiredevDependencies
sont:npm install
un répertoire qui contientpackage.json
, à moins que vous ne passiez le--production
drapeau (allez voter la réponse de Gayan Charith ).npm install "$package"
aucun autre répertoire, sauf si vous lui en donnez l'--dev
option.peerDependencies
: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ée par @nextgentech )Transitivité (mentionnée par Ben Hutchison ):
dependencies
sont installés de manière transitoire: si A nécessite B et 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 transitoire. 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é sur la question suivante: Avantages de bundledDependencies par rapport aux dépendances normales dans NPMoptionalDependencies
(mentionné par Aidan Feldman )devDependencies
dependencies
sont nécessaires pour exécuter,devDependencies
uniquement pour développer, par exemple: tests unitaires, transpilation CoffeeScript vers JavaScript, minification, ...Si vous allez développer un paquet, vous le téléchargez (par exemple via
git clone
), allez à sa racine qui contientpackage.json
et exécutez:Puisque vous avez la source réelle, il est clair que vous souhaitez la développer, donc par défaut, à la fois
dependencies
(puisque vous devez, bien sûr, exécuter pour développer) et lesdevDependency
dépendances sont également installés.Si toutefois vous n'êtes qu'un utilisateur final qui souhaite simplement installer un package pour l'utiliser, vous le ferez à partir de n'importe quel répertoire:
Dans ce cas, vous ne voulez pas normalement les dépendances de développement, de sorte que vous obtenez juste ce qu'il faut pour utiliser le package:
dependencies
.Si vous voulez vraiment installer des packages de développement dans ce cas, vous pouvez définir l'
dev
option de configuration surtrue
, éventuellement à partir de la ligne de commande comme:L'option est
false
par défaut car il s'agit d'un cas beaucoup moins courant.peerDependencies
(Testé avant 3.0)
Source: https://nodejs.org/en/blog/npm/peer-dependencies/
Avec les dépendances régulières, vous pouvez avoir plusieurs versions de la dépendance: elle est simplement installée à l'intérieur
node_modules
de la dépendance.Par exemple, si
dependency1
et lesdependency2
deux dépendent dedependency3
versions différentes, l'arborescence du projet ressemblera à:Les plugins, cependant, sont des packages qui ne nécessitent normalement pas l'autre package, qui est appelé l' hôte dans ce contexte. Au lieu:
Par exemple, si
dependency1
et lesdependency2
pairs en dépendentdependency3
, l'arborescence du projet ressemblera à:Cela se produit même si vous ne le mentionnez jamais
dependency3
dans votrepackage.json
fichier.Je pense que ceci est une instance du modèle de conception d' inversion de contrôle .
Un exemple prototype 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 unpeer-dependency
require('grunt')
est soustests/
: il n'est pas réellement utilisé par le programme.Ensuite, lorsque l'utilisateur utilisera un plugin, il aura implicitement besoin du plugin depuis
Gruntfile
en ajoutant unegrunt.loadNpmTasks('grunt-contrib-uglify')
ligne, mais c'estgrunt
que l'utilisateur appellera directement.Cela ne fonctionnerait pas si chaque plugin nécessitait une version Grunt différente.
Manuel
Je pense que la documentation répond assez bien à la question, peut-être que vous n'êtes pas assez familier avec les gestionnaires de nœuds / autres packages. Je ne le comprends probablement que parce que je connais un peu le bundle Ruby.
La ligne clé est:
Et puis sous npm-config (7) trouver
dev
:la source
npm install package
c'était une commande que vous utiliseriez pour installer tous les packages qui ne sont pas des dépendances de dev, plutôt que ce que je pense maintenant que vous vouliez dire, qui était «installez le package appelé [package]», et c'est ainsi que je pensais que cela fonctionnait avant de lire ceci. Si j'étais vous, je modifierais pour dire [nom-package] qui montre clairement que ce que vous voulez dire est «insérer-nom-ici».peerDependencies
comportement dans le prochain npm @ 3. De blog.npmjs.org/post/110924823920/npm-weekly-5 : "Nous ne téléchargerons plus automatiquement la dépendance des pairs. Au lieu de cela, nous vous avertirons si la dépendance des pairs n'est pas déjà installée. Cela vous oblige pour résoudre les conflits peerDependency vous-même, manuellement, mais à long terme, cela devrait rendre moins probable que vous vous retrouviez dans une situation délicate avec les dépendances de vos packages. "npm install
partir du package A, vous obtiendrez B et C mais pas D.devDependencies
noter que ceux qui ne sont pas installés lorsqueNODE_ENV
est défini surproduction
.Si vous ne souhaitez pas installer devDependencies, vous pouvez utiliser
npm install --production
la source
--save
option n'est plus nécessaire. Si vous faites "npm install my-package", il ajoutera my-package en tant que dépendance dans votrepackage.json
fichier.Par exemple, mocha serait normalement une devDependency, car les tests ne sont pas nécessaires en production, tandis qu'express serait une dépendance.
la source
dépendances
Dépendances que votre projet doit exécuter, comme une bibliothèque qui fournit des fonctions que vous appelez à partir de votre code.
Ils sont installés de manière transitoire (si A dépend de B dépend de C, npm install sur A installera B et C).
Exemple: lodash: votre projet appelle des fonctions lodash.
devDependencies
Dépendances dont vous n'avez besoin que pendant le développement ou la publication, comme les compilateurs qui prennent votre code et le compilent en javascript, testent des frameworks ou des générateurs de documentation.
Ils ne sont pas installés de manière transitoire (si A dépend de B dev-dépend de C, npm install sur A installera B uniquement).
Exemple: grunt: votre projet utilise grunt pour se construire.
peerDependencies
Dépendances auxquelles votre projet se connecte ou modifie dans le projet parent, généralement un plugin pour une autre bibliothèque ou un autre outil. Il s'agit simplement d'une vérification, en vous assurant que le projet parent (projet qui dépendra de votre projet) a une dépendance sur le projet auquel vous vous connectez. Donc, si vous créez un plugin C qui ajoute des fonctionnalités à la bibliothèque B, alors quelqu'un qui crée un projet A devra avoir une dépendance sur B s'il a une dépendance sur C.
Ils ne sont pas installés (sauf si npm <3), ils ne sont que vérifié.
Exemple: grunt: votre projet ajoute des fonctionnalités à grunt et ne peut être utilisé que sur des projets utilisant grunt.
Cette documentation explique très bien les dépendances entre pairs: https://nodejs.org/en/blog/npm/peer-dependencies/
De plus, la documentation npm a été améliorée au fil du temps et propose désormais de meilleures explications des différents types de dépendances: https://github.com/npm/cli/blob/latest/doc/files/package.json.md#devdependencies
la source
Pour enregistrer un package dans package.json en tant que dépendances de développement:
Lorsque vous l'exécutez,
npm install
il installera à la foisdevDependencies
etdependencies
. Pour éviter l'installation,devDependencies
exécutez:la source
Certains modules et packages sont uniquement nécessaires au développement, mais ne sont pas nécessaires en production. Comme il le dit dans la documentation :
la source
Une explication simple qui m'a rendu plus clair est:
Lorsque vous déployez votre application, les modules dans les dépendances doivent être installés ou votre application ne fonctionnera pas. Les modules dans devDependencies n'ont pas besoin d'être installés sur le serveur de production car vous ne développez pas sur cette machine. lien
la source
vendor.js
, toutes les bibliothèques seront intégrées, tous nos dépôts devraient être des dépôts si le code compilé est validé dans le dépôt. Et cela devrait être validé, car il est également étrange que vous deviez compiler le module, pas seulement l'installer (et les tests sont également quelque part ici car tout changement dans les sous-modules peut conduire à une régression) ...webpack -p
je veux dire. s'il vous plait répondez à ma question.Je voudrais ajouter à la réponse mon point de vue sur ces explications des dépendances
dependencies
sont utilisés pour une utilisation directe dans votre base de code, des éléments qui se retrouvent généralement dans le code de production ou des morceaux de codedevDependencies
sont utilisés pour le processus de construction, des outils qui vous aident à gérer la façon dont le code final se terminera, des modules de test tiers, (par exemple, des trucs webpack)la source
En bref
Dépendances -
npm install <package> --save-prod
installe les packages requis par votre application dans l'environnement de production.DevDependencies -
npm install <package> --save-dev
installe les packages requis uniquement pour le développement local et les testsUne simple frappe
npm install
installe tous les packages mentionnés dans le package.jsondonc si vous travaillez sur votre ordinateur local, tapez
npm install
et continuez :)la source
peerDependencies
n'a pas vraiment de sens pour moi jusqu'à ce que je lise cet extrait d' un article de blog sur le sujet Ciro mentionné ci-dessus :Le plugin attend une version spécifique de l'hôte ...
peerDependencies
sont pour les plugins, les bibliothèques qui nécessitent une bibliothèque "hôte" pour remplir leur fonction, mais qui peuvent avoir été écrites à un moment avant la sortie de la dernière version de l'hôte.Autrement dit, si j'écris
PluginX v1
pourHostLibraryX v3
et m'en vais , il n'y a aucune garantie quePluginX v1
cela fonctionnera quandHostLibraryX v4
(ou mêmeHostLibraryX v3.0.1
) sera libéré.... mais le plugin ne dépend pas de l'hôte ...
Du point de vue du plugin, il ajoute uniquement des fonctions à la bibliothèque hôte. Je n'ai pas vraiment "besoin" de l'hôte pour ajouter une dépendance à un plugin, et les plugins ne dépendent souvent pas littéralement de leur hôte. Si vous n'avez pas l'hôte, le plugin ne fait rien sans danger.
Cela signifie que ce
dependencies
n'est pas vraiment le bon concept pour les plugins.Pire encore, si mon hôte était traité comme une dépendance, nous finirions dans cette situation que le même article de blog mentionne (un peu modifié pour utiliser l'hôte et le plug-in composés de cette réponse):
... et l'hôte ne dépend évidemment pas du plugin ...
... c'est tout l'intérêt des plugins. Maintenant, si l'hôte était assez gentil pour inclure des informations de dépendance pour tous ses plugins, cela résoudrait le problème, mais cela introduirait également un énorme nouveau problème culturel : la gestion des plugins!
L'intérêt des plugins est qu'ils peuvent se coupler de manière anonyme. Dans un monde parfait, la gestion de l'hôte par tous serait soignée et ordonnée, mais nous n'allons pas exiger des bibliothèques de chats de troupeau.
Si nous ne sommes pas dépendants hiérarchiquement, nous sommes peut-être des pairs indépendants l'un de l'autre ...
Au lieu de cela, nous avons le concept d'être des pairs. Ni l'hôte ni le plugin ne se trouvent dans le compartiment de dépendance de l'autre. Les deux vivent au même niveau du graphique de dépendance.
... mais ce n'est pas une relation automatisable. <<< Moneyball !!!
Si je suis
PluginX v1
et m'attends à un pair de (c'est-à-dire, avoir une dépendance de pair de )HostLibraryX v3
, je le dirai. Si vous avez mis à niveau automatiquement la dernière versionHostLibraryX v4
(notez qu'il s'agit de la version 4 ) ET que vous l' avezPlugin v1
installé, vous devez savoir, non?npm
ne peut pas gérer cette situation pour moi -... ou...
Et non, npm?!
Donc, npm ne le fait pas. Il vous avertit de la situation et vous permet de déterminer s'il
HostLibraryX v4
s'agit d'un pair appropriéPlugin v1
.Coda
Une bonne
peerDependency
gestion des plugins rendra ce concept plus intuitif dans la pratique. Du blog , encore une fois ...la source
Dépendances vs dépendances dev
Les dépendances de développement sont des modules qui ne sont nécessaires que pendant le développement tandis que les dépendances sont requises au moment de l'exécution. Si vous déployez votre application, des dépendances doivent être installées, sinon votre application ne fonctionnera tout simplement pas. Les bibliothèques que vous appelez à partir de votre code qui permet au programme de s'exécuter peuvent être considérées comme des dépendances.
Eg- React, React - dom
Les modules de dépendance de développement n'ont pas besoin d'être installés sur le serveur de production car vous n'allez pas développer sur cette machine. Les compilateurs qui convertissent votre code en javascript, les frameworks de test et les générateurs de documents peuvent être considérés comme des dépendances de développement car ils ne sont requis que pendant le développement.
Par exemple: ESLint, Babel, webpack
@FYI,
Si vous publiez vers npm, il est important que vous utilisiez l'indicateur correct pour les modules corrects. Si c'est quelque chose dont votre module npm a besoin pour fonctionner, utilisez l'indicateur "--save" pour enregistrer le module en tant que dépendance. Si c'est quelque chose que votre module n'a pas besoin de fonctionner mais qu'il est nécessaire pour les tests, alors utilisez l'indicateur "--save-dev".
la source
Lorsque vous essayez de distribuer un package npm, vous devez éviter de l'utiliser
dependencies
. Au lieu de cela, vous devez envisager de l'ajouterpeerDependencies
ou de le supprimerdependencies
.la source
J'ai trouvé une explication simple.
Réponse courte:
dépendances "... sont celles dont votre projet a vraiment besoin pour pouvoir travailler en production."
devDependencies "... sont celles dont vous avez besoin pendant le développement."
peerDependencies "si vous souhaitez créer et publier votre propre bibliothèque afin qu'elle puisse être utilisée comme dépendance"
Plus de détails dans cet article: https://code-trotter.com/web/dependencies-vs-devdependencies-vs-peerdependencies
la source