Почему, например, плагин Grunt определяет свою зависимость от grunt как « равноправные зависимости »?
Почему плагин не может просто иметь Grunt как свою собственную зависимость в grunt-plug / node_modules ?
Зависимости пира описаны здесь: https://nodejs.org/en/blog/npm/peer-dependencies/
Но я не совсем понимаю.
пример
Сейчас я работаю со стероидами AppGyver, которые используют задачи Grunt для создания моих исходных файлов в папке / dist / для обслуживания на локальном устройстве. Я совершенно новый в npm и хрюкаю, поэтому я хочу полностью понять, что происходит.
Пока я получаю это:
[rootfolder] /package.json сообщает npm, что это зависит от grunt-steroids
пакета npm для разработки:
"devDependencies": {
"grunt-steroids": "0.x"
},
Ладно. Запуск npm install в [rootfolder] обнаруживает зависимость и устанавливает grunt-стероиды в [rootfolder] / node_modules / grunt-steroids .
Затем Npm читает [rootfolder] /node_modules/grunt-steroids/package.json, чтобы установить grunt-steroids
собственные зависимости.
"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"
},
Пакеты " зависимостей " устанавливаются в [rootfolder] / node_modules / grunt-steroids / node_modules, что логично для меня.
« DevDependencies » не установлены, что, я уверен, контролируется npm, определяющим, что я просто пытаюсь использовать grunt-steroids
, а не развиваться на нем.
Но тогда у нас есть " peerDependencies ".
Они установлены в [rootfolder] / node_modules , и я не понимаю, почему там, а не в [rootfolder] / node_modules / grunt-steroids / node_modules, чтобы избежать конфликтов с другими подключаемыми плагинами (или чем-то еще)?
источник
"grunt": "0.4.4"
это как в devDependencies, так и в peerDependencies, и для меня имеет смысл иметь там дубликат, потому что это означает, что мне нужен и этотgrunt
пакет для моего собственного использования, а также то, что пользователи моего библиотека может использовать свою собственную версию, если она учитывает блокировку версии peerDependencies. Это правильно? Или пример ОП очень плохой?JacksModule
зависит от того,JillsModule ^1.0.0
сJillsModule
будучи равноправным зависимостьJacksModule
иYourCoolProject
использовалиJacksModule
иJillsModule ^2.0.0
, мы получим предупреждение о зависимостях сверстников по НПМ, который посоветует нам установить ,JillsModule ^1.0.0
как хорошо. Но что происходит потом?YourCoolProject
теперь будет иметь две версииJillsModule
импортируемых черезimport jillsModule from "..."
? И как я помню, что при использованииJacksModule
мне нужно передать его экземплярJillsModule v1.0.0
?JacksModule
, обновите его, чтобы зависеть от него,JillsModule ^2.0.0
и предложите PR для сопровождающего проекта. Это может помочь при появлении сообщения об ошибке, говорящего, что эта зависимость устарела, и вы хотели бы помочь обновить ее. Если вы сделаете хороший пиар, большинство сопровождающих библиотек объединят его и поблагодарить за это. Если сопровождающие не отвечают, вы можете опубликовать свой форк в пространстве имен NPM под своим именем и использовать вместо этого свой форк. В любом случае, есть решения, ноpeerDependencies
не решить их самостоятельно.Я бы порекомендовал вам сначала прочитать статью снова. Это немного сбивает с толку, но пример с winston-mail показывает вам ответ:
В этом случае возможно иметь несколько версий пакета, что может вызвать некоторые проблемы. Зависимости между равноправными узлами позволяют разработчикам npm убедиться, что у пользователя есть определенный модуль (в корневой папке). Но вы правы в том, что описание одной конкретной версии пакета может привести к проблемам с другими пакетами, использующими другие версии. Эта проблема связана с разработчиками npm, как говорится в статьях
Поэтому разработчики должны следовать semver для определения peerDependencies. Вы должны открыть вопрос для пакета grunt-стероидов на GitHub ...
источник
multiple versions of a package which would cause some issues
но не в этом ли суть менеджера пакетов? Они даже обсуждают это далее в той же статье, где в проекте есть 2 версии одного и того же пакета: одна предоставлена разработчиком, а другая - сторонней библиотекой.winston
примере я теперь просто не могу использоватьwinston-mail
библиотеку, потому что моя версия не соответствует одноранговой зависимости? Я бы предпочел иметь это временное понижение с последней и самой лучшей версии для библиотеки 1, чем вообще не использовать ее.peerDependencies
объяснено на простейшем возможном примере:запуск npm install в myPackage выдаст ошибку, потому что он пытается установить версию React
^15.0.0
AND,foo
которая совместима только с React^16.0.0
.peerDependencies НЕ установлены.
источник
foo
работает как с React 15, так и с React 16, он может указать свой peerDependency как>=15 < 17
.