Pourquoi utiliser le peer dépendances dans les mnp pour les plugins?
Pourquoi, par exemple, un plugin Grunt définir sa dépendance sur grunt comme "par les pairs dépendances"?
Pourquoi ne peut pas le plugin juste Grunt comme sa propre dépendance à grunt-plug/node_modules?
Par les pairs dépendances sont décrites ici: https://nodejs.org/en/blog/npm/peer-dependencies/
Mais je n'ai pas vraiment l'obtenir.
Exemple
Je travaille avec AppGyver des Stéroïdes à l'heure actuelle, qui utilise des tâches Grunt pour créer mes fichiers source dans un /dist/dossier pour être servi sur un périphérique local. Je suis assez nouveau à mnp et un grognement alors je veux bien comprendre ce qui se passe.
Jusqu'à présent, j'obtiens ceci:
[rootfolder]/paquet.json dit mnp il dépend de la grunt-steroids
mnp package pour le développement:
"devDependencies": {
"grunt-steroids": "0.x"
},
D'accord. L'exécution de npm install dans [rootfolder] détecte la dépendance et installe grunt-stéroïdes dans [rootfolder]/node_modules/grunt-stéroïdes.
Mnp lit ensuite [rootfolder]/node_modules/grunt-stéroïdes/paquet.json de sorte qu'il peut installer grunt-steroids
propres dépendances.:
"devDependencies": {
"grunt-contrib-nodeunit": "0.3.0",
"grunt": "0.4.4"
},
"dependencies": {
"wrench": "1.5.4",
"chalk": "0.3.0",
"xml2js": "0.4.1",
"lodash": "2.4.1"
},
"peerDependencies": {
"grunt": "0.4.4",
"grunt-contrib-copy": "0.5.0",
"grunt-contrib-clean": "0.5.0",
"grunt-contrib-concat": "0.4.0",
"grunt-contrib-coffee": "0.10.1",
"grunt-contrib-sass": "0.7.3",
"grunt-extend-config": "0.9.2"
},
La "dépendances" paquets sont installés dans [rootfolder]/node_modules/grunt-stéroïdes/node_modules ce qui est logique pour moi.
La "devDependencies" ne sont pas installées, qui je suis sûr est contrôlée par npm la détection, je suis juste essayer d'utiliser grunt-steroids
, et ne pas se développer sur elle.
Mais ensuite, nous avons la "peerDependencies".
Ceux-ci sont installés dans [rootfolder]/node_modules, et je ne comprends pas pourquoi là et pas dans [rootfolder]/node_modules/grunt-stéroïdes/node_modules afin que les conflits avec d'autres plugins grunt (ou autre) sont à éviter?
Vous devez vous connecter pour publier un commentaire.
TL;DR:[1]
peerDependencies
sont les dépendances qui sont les plus exposées (et qui devrait être utilisée par) la consommation de code, par opposition à "privé" dépendances qui ne sont pas exposés, et ne sont qu'un détail d'implémentation.Le problème des pairs dépendances résoudre
MNP module du système est hiérarchique. Un grand avantage pour la plus simple des scénarios, c'est que lorsque vous installez un package npm, qui package apporte ses propres dépendances avec elle afin qu'il fonctionne hors de la boîte.
Mais des problèmes surviennent lors de l':
Dans L'Exemple
Disons que vous êtes en bâtiment
YourCoolProject
et que vous utilisez à la fois desJacksModule 1.0
etJillsModule 2.0
. Et supposons queJacksModule
dépend aussi deJillsModule
, mais sur une autre version, disons1.0
. Tant que ces 2 versions ne pas répondre, il n'y a pas de problème. Le fait queJacksModule
est à l'aide deJillsModule
en dessous de la surface est juste un détail d'implémentation. Nous sommes le regroupementJillsModule
deux fois, mais c'est un petit prix à payer quand nous arrivons logiciel stable hors de la boîte.Mais maintenant, si
JacksModule
expose sa dépendance surJillsModule
d'une certaine façon. Il accepte une instance deJillsClass
par exemple... Ce qui se passe lorsque nous créons unenew JillsClass
l'aide de la version2.0
de la bibliothèque et de le transmettre àjacksFunction
? L'enfer va barder! Des choses simples commejillsObject instanceof JillsClass
soudain retourfalse
parce quejillsObject
est en fait une instance de un autreJillsClass
, le2.0
version.Comment les dépendances de résoudre ce
Ils disent mnp
Quand mnp voit que votre colis est en cours d'installation dans un projet qui ne pas ont cette dépendance, ou qui a un version incompatible de lui, il avertit l'utilisateur pendant le processus d'installation.
Quand devez-vous utiliser par les pairs des dépendances?
Scénarios courants sont des plugins pour les grands cadres. Pensez à des choses comme Gulp, Grunt, Babel, de Moka, de etc. Si vous écrivez une Gorgée plugin, vous voulez que le plugin fonctionne avec le même Trait que l'utilisateur projet est à l'aide, non pas avec votre propre version de Gulp.
Annotations
"grunt": "0.4.4"
est à la fois dans devDependencies et peerDependencies, et il est logique pour moi d'avoir un doublon, il, parce qu'il signifie à la fois que j'ai besoin quegrunt
paquet pour mon propre usage, mais aussi que les utilisateurs de ma bibliothèque peuvent utiliser leur propre version, tant qu'elle respecte la peerDependencies version de verrouillage. Est-ce exact? Ou est l'OP exemple d'un très mauvais?on-way-talk
règle(pas de parler les uns aux autres), alors il n'est pas nécessaire pour peerDependencies.Et peerDependencies solution est simplement d'avertissement. La décision finale dépend de développeur.Je vous recommande de lire l'article à nouveau la première. C'est un peu confus, mais l'exemple de winston-mail vous montre la réponse pourquoi:
Dans ce cas, il est possible d'avoir plusieurs versions d'un paquet qui serait la cause de certains problèmes. Peer dépendances permettent mnp développeurs pour s'assurer que l'utilisateur a le module spécifique (dans le dossier racine). Mais vous avez raison sur le point que décrivant une version spécifique d'un ensemble de mesures devrait conduire à des problèmes avec d'autres paquets en utilisant d'autres versions. Cette question a à voir avec npm développeurs, comme les articles, les états
Par conséquent, les développeurs devraient suivre semver pour définir peerDependencies. Vous devriez ouvrir un sujet pour l'grunt-stéroïdes paquet sur GitHub...
multiple versions of a package which would cause some issues
mais n'est-ce pas le but d'un gestionnaire de paquets? Ils ont même de discuter de cela plus loin dans le même article où il y a 2 versions d'un même package dans le projet: celui fourni par le développeur et celui fourni par une 3ème partie de la bibliothèque.winston
exemple je suis maintenant juste incapable d'utiliser lewinston-mail
bibliothèque parce que ma version ne correspond pas au par les pairs de la dépendance? Je préférerais de beaucoup avoir que temporaire, le déclassement de la dernière et la plus grande pour le 1 de la bibliothèque plutôt que de ne pas être en mesure de l'utiliser du tout.peerDependencies
expliqué avec l'exemple le plus simple possible:l'exécution de npm install dans myPackage lèvera une erreur parce qu'il essaie d'installer Réagir la version
^15.0.0
ETfoo
qui est uniquement compatible avec Réagissent^16.0.0
.peerDependencies ne sont PAS installés.
foo
fonctionne avec les deux Réagissent 15 et Réagir 16, la pourrait de la liste de ses peerDependency comme>=15 < 17
.