Dlaczego na przykład wtyczka Grunt definiuje swoją zależność od chrząstki jako „ zależności równorzędne ”?
Dlaczego wtyczka nie może mieć Grunta jako własnej zależności w chrust-plug / node_modules ?
Zależności rówieśników opisano tutaj: https://nodejs.org/en/blog/npm/peer-dependencies/
Ale tak naprawdę nie rozumiem.
Przykład
Obecnie pracuję ze sterydami AppGyver, które wykorzystują zadania Grunt do budowania plików źródłowych w folderze / dist /, który ma być obsługiwany na urządzeniu lokalnym. Jestem całkiem nowy w npm i chrząkać, więc chcę w pełni zrozumieć, co się dzieje.
Do tej pory rozumiem:
[rootfolder] /package.json mówi npm, że programowanie zależy od grunt-steroids
pakietu npm:
"devDependencies": {
"grunt-steroids": "0.x"
},
W porządku. Uruchamianie npm install w [rootfolderze] wykrywa zależność i instaluje sterydy gruntu w [rootfolderze] / node_modules / grunt-sterydy .
Npm następnie odczytuje [rootfolder] /node_modules/grunt-steroids/package.json, aby mógł zainstalować grunt-steroids
własne zależności:
"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"
},
Pakiety „ zależności ” są instalowane w [rootfolder] / node_modules / grunt-steroids / node_modules, co jest dla mnie logiczne.
„ DevDependencies ” nie są zainstalowane, co jestem pewien, że jest kontrolowane przez wykrywanie npm, którego próbuję użyć grunt-steroids
, a nie rozwijam na nim.
Ale potem mamy „ peerDependencies ”.
Są one instalowane w [rootfolder] / node_modules , a ja nie rozumiem, dlaczego tam jest, a nie w [rootfolder] / node_modules / grunt-steroids / node_modules, aby uniknąć konfliktów z innymi wtyczkami (lub cokolwiek innego)?
źródło
"grunt": "0.4.4"
to zarówno devDependencies, jak i peerDependencies, i sensowne jest dla mnie, aby mieć tam duplikat, ponieważ oznacza to zarówno, że potrzebuję tegogrunt
pakietu na własny użytek, ale także, że użytkownicy mojego biblioteka może korzystać z własnej wersji, o ile przestrzega blokady wersji peerDependencies. Czy to jest poprawne? A może przykład OP jest bardzo zły?JacksModule
zależyJillsModule ^1.0.0
zJillsModule
czym zależność rówieśnikJacksModule
iYourCoolProject
używaliśmyJacksModule
iJillsModule ^2.0.0
będziemy dostać ostrzeżenie o zależnościach typu peer przez KMP, który doradzi nam zainstalowaćJillsModule ^1.0.0
również. Ale co się wtedy stanie?YourCoolProject
będzie teraz mieć dwie wersje doJillsModule
importowaniaimport jillsModule from "..."
? I jak mam pamiętać, że kiedy używamJacksModule
, muszę przekazać to wystąpienieJillsModule v1.0.0
?JacksModule
repozytorium, uaktualnij go, aby polegać na nimJillsModule ^2.0.0
i zaoferuj PR dla opiekuna projektu. Pomocne może być przesłanie błędu, który mówi, że ta zależność jest nieaktualna i chcesz ją zaktualizować. Jeśli zrobisz dobry PR, większość opiekunów bibliotecznych połączy go i ci za to podziękuje. Jeśli opiekunowie nie reagują, możesz opublikować swój widelec w przestrzeni nazw NPM pod swoim nazwiskiem i zamiast tego użyć widelca. W każdym razie istnieją rozwiązania, alepeerDependencies
nie rozwiązują go same.Polecam najpierw przeczytać ten artykuł. To trochę mylące, ale przykład z Winston-Mail pokazuje odpowiedź, dlaczego:
W takim przypadku możliwe jest posiadanie wielu wersji pakietu, co spowodowałoby pewne problemy. Zależności równorzędne pozwalają programistom npm upewnić się, że użytkownik ma określony moduł (w folderze głównym). Ale masz rację z tym, że opis jednej konkretnej wersji pakietu doprowadziłby do problemów z innymi pakietami używającymi innych wersji. Ten artykuł dotyczy programistów npm, jak mówią artykuły
Dlatego programiści powinni stosować semver do definiowania peerDependencies. Powinieneś otworzyć problem dotyczący pakietu sterydów na GitHub ...
źródło
multiple versions of a package which would cause some issues
ale czy nie o to chodzi w menedżerze pakietów? Dyskutują nawet o tym dalej w tym samym artykule, w którym w projekcie są 2 wersje tego samego pakietu: jedna dostarczona przez programistę, a druga dostarczona przez bibliotekę zewnętrzną.winston
przykładzie nie mogę teraz korzystać zwinston-mail
biblioteki, ponieważ moja wersja nie pasuje do zależności równorzędnej? Wolałbym tymczasowo obniżyć wersję z najnowszej i najlepszej dla biblioteki 1, niż w ogóle nie móc jej używać.peerDependencies
wyjaśnione najprostszym możliwym przykładem:uruchomienie npm install w myPackage wyśle błąd, ponieważ próbuje zainstalować wersję React
^15.0.0
ORAZ,foo
która jest kompatybilna tylko z React^16.0.0
.peerDependencies NIE są zainstalowane.
źródło
foo
działa zarówno z React 15, jak i React 16, może wymienić swoją peerDependency jako>=15 < 17
.