Pourquoi, par exemple, un plugin Grunt définit-il sa dépendance vis-à-vis de grunt comme des " dépendances entre pairs "?
Pourquoi le plugin ne peut-il pas simplement avoir Grunt comme sa propre dépendance dans grunt-plug / node_modules ?
Les dépendances entre pairs sont décrites ici: https://nodejs.org/en/blog/npm/peer-dependencies/
Mais je ne comprends pas vraiment.
Exemple
Je travaille actuellement avec AppGyver Steroids qui utilise des tâches Grunt pour créer mes fichiers sources dans un dossier / dist / à servir sur un appareil local. Je suis tout à fait nouveau à npm et grognement, donc je veux bien comprendre ce qui se passe.
Jusqu'à présent, je comprends ceci:
[rootfolder] /package.json indique à npm que cela dépend du grunt-steroids
package npm 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-steroids dans [rootfolder] / node_modules / grunt-steroids .
Npm lit ensuite [rootfolder] /node_modules/grunt-steroids/package.json pour pouvoir installer ses 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"
},
Les packages " dépendances " sont installés dans [rootfolder] / node_modules / grunt-steroids / node_modules, ce qui est logique pour moi.
Les " devDependencies " ne sont pas installés, ce qui, j'en suis sûr, est contrôlé par la détection de npm que j'essaie simplement d'utiliser grunt-steroids
, et que je ne développe pas dessus.
Mais alors nous avons les " pairsDépendances ".
Ceux-ci sont installés dans [rootfolder] / node_modules , et je ne comprends pas pourquoi là-bas et pas dans [rootfolder] / node_modules / grunt-steroids / node_modules afin d' éviter les conflits avec d'autres plugins grunt (ou autre)?
la source
"grunt": "0.4.4"
c'est à la fois dans devDependencies et peerDependencies, et cela a du sens pour moi d'avoir un doublon là, car cela signifie à la fois que j'ai besoin de cegrunt
package pour mon propre usage, mais aussi que les utilisateurs de mon La bibliothèque peut utiliser sa propre version, tant qu'elle respecte le verrou de version peerDependencies. Est-ce exact? Ou l'exemple OP est-il très mauvais?JacksModule
dépendJillsModule ^1.0.0
d'JillsModule
être une dépendance de pairJacksModule
et que vousYourCoolProject
utilisiezJacksModule
etJillsModule ^2.0.0
, nous obtiendrons l'avertissement de dépendance de pair par NPM, qui nous conseillera d'installerJillsModule ^1.0.0
également. Mais que se passe-t-il alors?YourCoolProject
aura désormais deux versions deJillsModule
importable viaimport jillsModule from "..."
? Et comment puis-je me souvenir que lorsque j'utilise,JacksModule
je dois lui transmettre une instance deJillsModule v1.0.0
?JacksModule
référentiel, le mettre à jour en fonctionJillsModule ^2.0.0
et proposer un PR au responsable du projet. Il peut être utile de soumettre d'abord un bogue indiquant que cette dépendance est obsolète et que vous souhaitez aider à la mettre à jour. Si vous faites un bon PR, la plupart des mainteneurs de bibliothèque le fusionneront et vous en remercient. Si les responsables ne répondent pas, vous pouvez publier votre fork dans NPM namespaced sous votre nom et utiliser votre fork à la place. De toute façon, il existe des solutions maispeerDependencies
ne les résout pas de lui-même.Je vous recommanderais de relire l'article en premier. C'est un peu déroutant mais l'exemple avec winston-mail vous montre la réponse pourquoi:
Dans ce cas, il est possible d'avoir plusieurs versions d'un package, ce qui entraînerait certains problèmes. Les dépendances entre pairs permettent aux développeurs npm de s'assurer que l'utilisateur dispose du module spécifique (dans le dossier racine). Mais vous avez raison de dire que la description d'une version spécifique d'un package entraînerait des problèmes avec d'autres packages utilisant d'autres versions. Ce problème est lié aux développeurs npm, comme l'indiquent les articles
Par conséquent, les développeurs doivent suivre semver pour définir les dépendances entre pairs. Vous devriez ouvrir un problème pour le paquet grunt-steroids sur GitHub ...
la source
multiple versions of a package which would cause some issues
mais n'est-ce pas tout l'intérêt d'un gestionnaire de paquets? Ils en discutent même plus loin dans le même article où il y a 2 versions du même package dans le projet: une fournie par le développeur et une fournie par une bibliothèque tierce.winston
exemple, suis-je maintenant incapable d'utiliser lawinston-mail
bibliothèque parce que ma version ne correspond pas à la dépendance des pairs? Je préférerais de beaucoup avoir cette mise à niveau temporaire de la plus récente et de la meilleure pour la bibliothèque 1 plutôt que de ne pas pouvoir l'utiliser du tout.peerDependencies
expliqué avec l'exemple le plus simple possible:l'exécution de npm install dans myPackage générera une erreur car il essaie d'installer la version React
^15.0.0
ETfoo
qui n'est compatible qu'avec React^16.0.0
.Les dépendances entre pairs ne sont PAS installées.
la source
foo
fonctionne à la fois avec React 15 et React 16, il pourrait répertorier sa peerDependency comme>=15 < 17
.