peerDependencies
n'avait pas vraiment de sens pour moi jusqu'à ce que je lise ce passage de un article de blog sur le sujet Ciro mentionné ci-dessus :
Quoi [ plugins Il faut un moyen d'exprimer ces "dépendances" entre les plugins et leur paquetage hôte. Une façon de dire : "Je ne fonctionne que lorsque je suis branché sur la version 1.2.x de mon paquetage hôte, donc si vous m'installez, assurez-vous que c'est avec un hôte compatible". Nous appelons cette relation une dépendance entre pairs.
Le plugin fait s'attendre à une version spécifique de l'hôte...
peerDependencies
sont destinés aux plugins, des bibliothèques qui nécessitent une bibliothèque "hôte" pour remplir leur fonction, mais qui peuvent avoir été écrits à un moment donné. avant la dernière version de l'hôte a été publiée.
C'est-à-dire que si j'écris PluginX v1
pour HostLibraryX v3
et s'en aller, il n'y a aucune garantie PluginX v1
fonctionnera lorsque HostLibraryX v4
(ou même HostLibraryX v3.0.1
) est libéré.
... mais le plugin ne le fait pas. dépendent de sur l'hôte...
Du point de vue du plugin, il ne fait que ajoute à la bibliothèque de l'hôte. Je n'ai pas vraiment "besoin" de l'hôte pour ajouter une dépendance à un plugin, et les plugins n'en ont souvent pas besoin au sens propre du terme. dépendent de sur leur hôte. Si vous n'avez pas l'hôte, le plugin ne fait rien.
Cela signifie que 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 la situation suivante le même article de blog mentionne (modifié un peu pour utiliser l'hôte et le plugin inventés par cette réponse) :
Mais maintenant, [si nous traitons la version contemporaine de HostLibraryX comme une dépendance de PluginX,] l'exécution de la commande npm install
donne lieu au graphique de dépendance inattendu de
├── HostLibraryX@4.0.0
└─┬ PluginX@1.0.0
└── HostLibraryX@3.0.0
Je laisse à votre imagination les échecs subtils dus au fait que le plugin utilise une API [HostLibraryX] différente de celle de l'application principale.
... 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 sur les dépendances de tous de ses plugins, cela résoudrait le problème, mais cela introduirait également un nouveau problème culturel énorme. : gestion des plugins !
L'intérêt des plugins est de pouvoir s'associer de manière anonyme. Dans un monde parfait, l'hôte pourrait gérer tous les plugins, mais nous n'avons pas besoin de bibliothèques pour gérer les chats.
Si nous ne sommes pas hiérarchiquement dépendants, nous sommes peut-être des pairs intradépendants...
Au lieu de cela, nous avons le concept d'être des pairs. Ni l'hôte ni le plugin ne se trouve dans le seau de dépendance de l'autre. Les deux vivent au même niveau du graphe de dépendance.
... mais ce n'est pas une relation automatisable. << Moneyball ! !!
Si je suis PluginX v1
et s'attendre à un pair de (c'est-à-dire, ont une PeerDependency de ) HostLibraryX v3
je le dirai. Si vous avez fait une mise à jour automatique vers la dernière HostLibraryX v4
(notez que c'est la version 4 ) ET ont Plugin v1
installé, tu dois savoir, non ?
npm
ne peut pas gérer cette situation pour moi
"Hé, je vois que tu utilises PluginX v1
! Je suis en train de rétrograder automatiquement HostLibraryX
de v4 à v3, kk ?"
... ou...
"Hé, je vois que tu utilises PluginX v1
. Cela 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 !
Et pourquoi pas non, npm ? !
Donc npm ne le fait pas. Il vous avertit de la situation, et vous laisse déterminer si HostLibraryX v4
est un pair approprié pour Plugin v1
.
Coda
Bon peerDependency
dans les plugins rendra ce concept plus intuitif dans la pratique. À partir de le billet de blog encore une fois...
Un conseil : les exigences en matière de dépendances homologues, contrairement à celles des dépendances ordinaires, doivent être souples. Vous ne devez pas verrouiller vos dépendances par les pairs à des versions de patch spécifiques. Ce serait vraiment ennuyeux si un plugin Chai 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 pris le temps de déterminer la version minimale de Chai avec laquelle ils sont compatibles.
80 votes
Notez qu'il existe également
optionalDependencies
maintenant.337 votes
AidanFeldman "optionalDependencies" est mon oxymore du jour.
6 votes
La documentation de npm dit : "dependencies" : Paquets requis par votre application en production. "devDependencies" : Les paquets qui ne sont nécessaires que pour le développement et les tests locaux. voir le lien : docs.npmjs.com/
0 votes
Les dépendances sont les références des paquets utilisés par votre bibliothèque sans lesquels elle ne peut pas fonctionner et qui doivent être installées automatiquement avec l'installation de votre bibliothèque. En regardant peerDependencies, npm enverra simplement un message d'avertissement si les paquets spécifiés ne sont pas trouvés dans les modules node. Il n'installera aucun paquet pour vous. Pour une explication détaillée, reportez-vous au lien : medium.com/p/16f43d6c7e45