Quelle est la différence entre les dépendances, les dépendances devd et les dépendances peerd dans le paquet npm?le dossier json?

cette documentation répond très mal à ma question. Je n'ai pas compris ces explications. Quelqu'un peut dire des mots plus simples? Peut-être avec des exemples si il est difficile de choisir des mots simples?

1524
demandé sur Robert Harvey 2013-09-18 18:57:06

10 réponses

Résumé d'importantes différences de comportement:

  • dependencies sont installés sur les deux:

    • npm install d'un répertoire qui contient package.json
    • npm install $package dans tout autre répertoire
  • devDependencies sont:

    • également installé sur npm install sur un répertoire qui contient package.json , à moins que vous ne passiez le drapeau --production (remonter réponse de Gayan Charith ).
    • non installé sur npm install "$package" sur un autre répertoire, sauf si vous lui donnez l'option --dev .
    • ne sont pas installés de façon transitoire.
  • peerDependencies :

    • Avant 3.0: sont toujours installés s'ils sont manquants, et soulèvent une erreur si plusieurs versions incompatibles de la dépendance sont utilisées par différentes dépendances.
    • prévu à partir de 3.0 (non testé): donnez un avertissement si manquant sur 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 façon transitoire: si A nécessite B, et B nécessite C, alors C est installé, sinon B ne pourrait pas fonctionner, et A.

    • devDependencies ne sont pas installés de façon transitoire. Par exemple: nous n'avons pas besoin de tester B pour test A, donc les dépendances de test de B peuvent être laissées de côté.

options connexes non abordées ici:

dépendances de dev

dependencies sont nécessaires pour exécuter devDependencies uniquement pour développer, par exemple: tests unitaires, transpilation 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 lancez:

npm install

Puisque vous avez la source réelle, il est il est clair que vous voulez le développer, donc par défaut les dépendances dependencies (puisque vous devez bien sûr Exécuter pour le développer) et devDependency sont aussi installées.

si toutefois vous êtes seulement un utilisateur final qui veut juste 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, Donc vous obtenez juste ce qui est nécessaire pour utiliser le paquet: dependencies .

si vous voulez vraiment installer des paquets de développement dans ce cas, vous pouvez définir l'option de configuration dev à 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 courant.

peerDependencies

(testé avant 3.0)

Source: https://nodejs.org/en/blog/npm/peer-dependencies/

avec des dépendances régulières, vous pouvez avoir plusieurs versions de la dépendance: elle est simplement installée à l'intérieur du node_modules de la dépendance.

E. G. si dependency1 et dependency2 tous deux dépendent de dependency3 à différentes versions l'arbre du projet ressemblera à:

root/node_modules/
                 |
                 +- dependency1/node_modules/
                 |                          |
                 |                          +- dependency3 v1.0/
                 |
                 |
                 +- dependency2/node_modules/
                                            |
                                            +- dependency3 v2.0/
Les Plugins

sont cependant des paquets qui n'ont normalement pas besoin de autre paquet, qui est appelé host dans ce contexte. À la place:

  • les plugins sont requis par l'hôte
  • plugins offrent une interface standard que l'hôte s'attend à trouver
  • seul l'hôte sera appelé directement par l'utilisateur, donc il doit y avoir une seule version de celui-ci.

E. G. si dependency1 et dependency2 par les pairs dépend de dependency3 , l'arborescence du projet ressemblera:

root/node_modules/
                 |
                 +- dependency1/
                 |
                 +- dependency2/
                 |
                 +- dependency3 v1.0/

cela arrive même si vous ne mentionnez jamais dependency3 dans votre fichier package.json .

je pense que c'est un exemple du Inversion de la commande motif 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 verrez que:

  • grunt est un peerDependency
  • le seul require('grunt') est sous tests/ : il n'est pas réellement utilisé par le programme.

puis, lorsque l'utilisateur va utiliser un plugin, il va implicitement exiger le plugin de la Gruntfile en ajoutant une grunt.loadNpmTasks('grunt-contrib-uglify') ligne, mais il est grunt que l'utilisateur appellera directement.

cela ne fonctionnerait pas si chaque plugin nécessitait une version Grunt différente.

manuel

je pense que le doc répond assez bien à la question, peut-être que vous n'êtes pas assez familier avec les nodes / autres gestionnaires de paquets. Je ne le comprends probablement que parce que je m'y connais un peu en Ruby bundler.

la ligne clé est:

ces les choses seront installées lors de l'installation de npm link ou npm à partir de la racine d'un paquet, et peuvent être gérées comme n'importe quel param de configuration npm. Voir npm-config(7) pour plus d'informations sur le sujet.

puis sous npm-config (7) trouver dev :

Default: false
Type: Boolean

Install dev-dependencies along with packages.
1822

si vous ne voulez pas installer les dépendances de dev, vous pouvez simplement utiliser npm install --production

378
répondu Gayan Charith 2015-07-05 10:06:35

à titre d'exemple, mocha serait normalement une dépendance vis-à-vis de la dévdépendance, puisque les tests ne sont pas nécessaires dans la production, tandis qu'express serait une dépendance.

92
répondu dankohn 2013-09-18 18:39:54

pour enregistrer un paquet en paquet .json en tant que dev dépendances:

npm install "$package" --save-dev

quand vous lancez npm install il installera à la fois devDependencies et dependencies . Pour éviter d'installer devDependencies exécuter:

npm install --production
49
répondu Mohammed Safeer 2018-04-23 10:36:11

il y a quelques modules et paquets seulement nécessaires pour le développement, qui ne sont pas nécessaires dans la production. Comme il est dit dans la documentation :

si quelqu'un prévoit de télécharger et d'utiliser votre module dans son programme, alors ils ne veulent probablement pas ou n'ont pas besoin de télécharger et de construire le test externe ou le cadre de documentation que vous utilisez. Dans ce cas, il est préférable d'énumérer ces éléments supplémentaires dans une dépendance de devDependencies hachage.

29
répondu Amberlamps 2013-09-18 14:59:46

dépendances

Les 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 façon transitoire (Si A dépend de B dépend de C, npm installer sur A installera B et C).

exemple: lodash: votre projet appelle quelques fonctions lodash.



Les dépendances dont vous avez besoin seulement pendant le développement ou la libération, comme les compilateurs qui prennent votre code et le compilent dans javascript, les cadres de test ou les générateurs de documentation.

Ils ne sont pas installés de façon transitoire (si A dépend de B dev-dépend de C, npm installer sur A installera B seulement).

exemple: grunt: votre projet utilise grunt pour se construire.

peerDependencies

Les dépendances que votre projet 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 s'assurant que le projet parent (projet qui dépendra de votre projet) a une dépendance sur le projet dans lequel vous vous accrochez. Donc si vous faites un plugin C qui ajoute des fonctionnalités à la bibliothèque B, alors quelqu'un qui fait un projet a aura besoin d'avoir une dépendance sur B s'il a une dépendance à L'égard de C.

Ils ne sont pas installés (sauf si npm < 3), ils ne sont vérifiés que pour.

exemple: grunt: votre projet ajoute des fonctionnalités à grunt et ne peut être utilisé que sur les projets qui utilisent grunt.

cette documentation explique très bien les dépendances entre pairs: https://nodejs.org/en/blog/npm/peer-dependencies /

en outre, la documentation npm a a été améliorée au fil du temps, et a maintenant de meilleures explications des différents types de dépendances: https://github.com/npm/npm/blob/master/doc/files/package.json.md#devdependencies

21
répondu qwertzguy 2017-09-05 17:27:44

une explication simple qui me l'a rendue plus claire 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 en devDependencies n'ont pas besoin d'être installés sur le serveur de production puisque vous ne développez pas sur cette machine. lien

9
répondu Jyoti Duhan 2017-09-29 15:36:08

j'aimerais ajouter à la réponse mon point de vue sur ces explications de dépendances

  • dependencies sont utilisés pour un usage direct dans votre base de codes, des choses qui se retrouvent habituellement dans le code de production, ou des morceaux de code
  • devDependencies sont utilisés pour le processus de construction, des outils qui vous aident à gérer comment le code final finira, des modules de test tiers, (ex. webpack stuff)
7
répondu Sîrbu Nicolae-Cezar 2018-02-16 11:40:18

peerDependencies n'avait pas tout à fait de sens pour moi jusqu'à ce que je lis cet extrait de un billet de blog sur le thème Ciro mentionné ci-dessus :

Ce que [ plugins ] besoin est une façon d'exprimer ces "dépendances" entre les plugins et leur hôte paquet. Une façon de dire, "Je ne travaille que lorsqu'il est branché à la version 1.2.x de mon paquet hôte, donc si vous m'installez, assurez-vous que c'est aux côtés d'un hôte compatible."Nous appelons cette relation une dépendance des pairs.

le plugin fait s'attendre une version spécifique de l'hôte...

peerDependencies sont des plugins, des bibliothèques qui ont besoin d'une bibliothèque "hôte" pour remplir leur fonction, mais qui peuvent avoir été écrites à la fois avant la dernière version de l'hôte a été publiée.

C'est-à-dire, si j'écris PluginX v1 pour HostLibraryX v3 et partez, il n'y a aucune garantie PluginX v1 fonctionnera quand HostLibraryX v4 (ou même HostLibraryX v3.0.1 ) est libéré.

... mais le plugin ne dépend pas de l'hôte...

du point de vue du plugin, il ne ajoute fonctions à la bibliothèque d'accueil. Je n'ai pas vraiment "besoin" de l'hôte pour ajouter une dépendance à un plugin, et les plugins ne le font pas littéralement dépendent de leur hôte. Si vous n'avez pas l'hôte, le plugin ne fait rien.

cela signifie dependencies n'est pas vraiment le bon concept pour les plugins.

pire encore, si mon hôte était traité comme une dépendance, nous nous retrouverions dans cette situation que le même billet de blog mentionne (édité un peu pour utiliser cette réponse est fait hôte & plugin):

mais maintenant, [si nous traitons la version contemporaine de HostLibraryX comme une dépendance pour PluginX,] lancer npm install se traduit par le graphe de dépendance inattendu de

├── HostLibraryX@4.0.0
└─┬ PluginX@1.0.0
  └── HostLibraryX@3.0.0

je vais laisser les échecs subtils qui viennent du plugin en utilisant une API [HostLibraryX] différente que l'application principale à votre imagination.

... et l'hôte ne dépend évidemment pas du plugin...

... c'est le point de l'ensemble des plugins. Maintenant si l'hôte était assez gentil pour inclure des informations de dépendance pour tous de ses plugins, cela résoudrait le problème, mais qui introduirait aussi un énorme nouveau problème culturel : gestion de plugin!

le but des plugins est qu'ils puissent s'apparier anonymement. Dans un monde parfait, avoir l'hôte gérer ' em tous serait soigné et rangé, mais nous n'allons pas exiger les bibliothèques regroupent des chats.

si nous ne sommes pas hiérarchiquement dépendants, peut-être sommes-nous des pairs intradépendants...

au lieu de cela, nous avons le concept d'être des pairs. Ni l'hôte ni le plugin ne s'assoit dans le seau de dépendances de l'autre. Les deux vivent au même niveau du graphique de dépendance.

... mais ce n'est pas automatisable relation.

si je suis PluginX v1 et s'attendre un Pair de (que est, ont un peerDependency de ) HostLibraryX v3 , je vais le dire. Si vous avez auto-mis à jour à la dernière HostLibraryX v4 (notez que la version 4 ) et ont Plugin v1 installé, vous devez savoir, Non?

npm ne peut pas gérer cette situation pour moi --

" je vois que vous utilisez PluginX v1 ! Je suis automatiquement déclassement HostLibraryX de v4 à v3, kk?"

... ou...

" je vois que vous utilisez PluginX v1 . Qui attend HostLibraryX v3 , que vous avez laissé dans la poussière lors de votre dernière mise à jour. Pour être sûr, je désinstalle automatiquement Plugin v1 !!1!

pourquoi pas non, npm?!

donc pas npm. Il vous alerte à la et vous permet de comprendre si HostLibraryX v4 est un pair approprié pour Plugin v1 .


Coda

Good peerDependency la gestion des plugins rendra ce concept plus intuitif dans la pratique. De le blog , encore une fois...

Un seul conseil: peer exigences de dépendance, à la différence pour les dépendances, doit être Clément. Vous ne devriez pas verrouiller vos pairs dépendances vers correctif spécifique versions. Il serait vraiment ennuyeux si un plugin Chai peer-dépendait de Chai 1.4.1, tandis qu'un autre dépendait de Chai 1.5.0, simplement parce que les auteurs étaient paresseux et n'ont pas passé le temps à comprendre la version minimale réelle de Chai avec laquelle ils sont compatibles.

1
répondu ruffin 2018-10-11 15:47:38

en essayant de distribuer un paquet npm, vous devez éviter d'utiliser dependencies . Vous devez plutôt envisager de l'ajouter dans peerDependencies ou de le supprimer de dependencies .

0
répondu Melchia 2018-07-06 12:47:33