Эта документация очень плохо отвечает на мой вопрос. Я не понял этих объяснений. Может ли кто-нибудь сказать более простыми словами? Может быть, с примерами, если трудно подобрать простые слова?
EDIT также добавил peerDependencies
, который тесно связан и может вызвать путаницу.
Краткое описание важных различий в поведении:
зависимости
устанавливаются в обоих случаях:npm install
из директории, содержащей package.json
npm install $package
из любой другой директорииdevDependencies
установлены:npm install
из каталога, содержащего package.json
, если только вы не передадите флаг --production
(go upvote Gayan Charith's answer).npm install "$package"
на любой другой каталог, если вы не передадите ей опцию --dev
.peerDependencies
:npm install
, и вы должны решить зависимость вручную. При запуске, если зависимость отсутствует, вы получите ошибку (упомянуто @nextgentech).зависимости
устанавливаются транзитивно: если A требует B, а B требует C, то C устанавливается, иначе B не сможет работать, как и A.devDependencies
не устанавливаются транзитивно. Например, нам не нужно тестировать B для тестирования A, поэтому зависимости для тестирования B можно не устанавливать.
Смежные опции здесь не обсуждаются:bundledDependencies
, который обсуждается в следующем вопросе: https://stackoverflow.com/questions/11207638/advantages-of-bundleddependencies-over-normal-dependencies-in-npm?lq=1optionalDependencies
(упоминается Aidan Feldman)dependencies
необходимы для запуска, devDependencies
- только для разработки, например: модульные тесты, транспиляция CoffeeScript в JavaScript, минификация, ...
Если вы собираетесь разрабатывать пакет, вы скачиваете его (например, через git clone
), переходите в его корень, который содержит package.json
, и запускаете:
npm install
Поскольку у вас есть исходный код, очевидно, что вы хотите его разработать, поэтому по умолчанию устанавливаются и dependencies
(поскольку вы, конечно же, должны выполнить разработку), и devDependency
зависимости.
Однако если вы являетесь конечным пользователем, который просто хочет установить пакет, чтобы использовать его, вы сможете сделать это из любого каталога:
npm install "$package"
В этом случае вам обычно не нужны зависимости для разработки, поэтому вы просто получите то, что необходимо для использования пакета: dependencies
.
Если вы действительно хотите установить пакеты разработки в этом случае, вы можете установить опцию конфигурации dev
на true
, возможно, из командной строки как:
npm install "$package" --dev
По умолчанию опция имеет значение false
, так как этот случай встречается гораздо реже.
(Проверено до версии 3.0)
Источник: https://nodejs.org/en/blog/npm/peer-dependencies/
С обычными зависимостями вы можете иметь несколько версий зависимости: они просто устанавливаются внутри node_modules
зависимости.
Например, если dependency1
и dependency2
зависят от dependency3
в разных версиях, дерево проекта будет выглядеть следующим образом:
root/node_modules/
|
+- dependency1/node_modules/
| |
| +- dependency3 v1.0/
|
|
+- dependency2/node_modules/
|
+- dependency3 v2.0/
Плагины, однако, являются пакетами, которые обычно не требуют другого пакета, который в данном контексте называется хост. Вместо этого:
dependency1
и dependency2
зависят от dependency3
, дерево проекта будет выглядеть как:root/node_modules/
|
+- dependency1/
|
+- dependency2/
|
+- dependency3 v1.0/
Это происходит, даже если вы никогда не упоминаете dependency3
в вашем файле package.json
.
Я думаю, что это пример паттерна проектирования Inversion of Control.
Прототипичным примером одноранговых зависимостей является Grunt, хост, и его плагины.
Например, на таком плагине Grunt, как https://github.com/gruntjs/grunt-contrib-uglify, вы увидите, что:
grunt
является равноправной зависимостью
.require('grunt')
находится в разделе tests/
: он'фактически не используется программой.
Тогда, когда пользователь будет использовать плагин, он будет неявно требовать плагин из Gruntfile
, добавляя строку grunt.loadNpmTasks('grunt-contrib-uglify')
, но именно grunt
будет вызываться пользователем напрямую.
Это не будет работать, если для каждого плагина требуется своя версия Grunt.Я думаю, что документация достаточно хорошо отвечает на вопрос, возможно, вы просто недостаточно знакомы с node / другими менеджерами пакетов. Я, вероятно, понимаю это только потому, что немного знаю о Ruby bundler. Ключевой фразой является:
Эти вещи будут установлены при выполнении npm link или npm install из корня пакета, и ими можно управлять, как любым другим параметром конфигурации npm. См. npm-config(7) для получения дополнительной информации по этой теме. А затем в npm-config(7) найдите
dev
:
Default: false
Type: Boolean
Install dev-dependencies along with packages.
Если вы не хотите устанавливать devDependencies содержит вы можете использовать НПМ установки --производство`
Чтобы сохранить пакет в пакет.в JSON* как зависимости Дев:
npm install "$package" --save-dev
Когда вы запустите НПМ установки-это установить
в разделе devDependenciesи
зависимости. Чтобы избежать запуска установки
в разделе devDependencies`:
npm install --production
зависимости Зависимости, что ваш проект должен работать, как библиотека, которая предоставляет функции, которые вызываются из кода. Они устанавливаются транзитивно (если А зависит от Б зависит от С, НПМ установки на установки B и C). Пример: лодашь: ваш проект вызывает некоторые функции лодашь.
в разделе devDependencies Зависимости нужно только в процессе разработки или выпуска, как компиляторы, которые берут код и компилировать его в JavaScript, тестирования или генераторов документации. Они не установлены транзитивно (если А зависит от Б Дев-зависит от С, НПМ установки на будет устанавливать только B). Пример: пехотинец: в проекте используется грунт, чтобы построить себя.
peerDependencies Зависимости, что ваш проект крючки или изменяет, в родительский проект, как правило, плагин для какой-либо другой библиотеки или инструмент. Он предназначен для проверки, убедившись, что родительский проект (проект, который будет зависеть от вашего проекта) имеет зависимость от проекта, который вы в крюк. Так что если вы сделаете плагин C, что расширяет его функциональные возможности библиотеки B, то кто-то делает проект будет иметь зависимость от B, если они имеют зависимость С. Они не установлены (если НПМ < 3), они проверяются только на. Пример: грунт: проект расширяет его функциональные возможности хрюкать и могут быть использованы только на проекты, которые используют грунт.
Эта документация очень хорошо объясняет коллегиального зависимостей: https://nodejs.org/en/blog/npm/peer-dependencies/
Кроме того, НПМ документация была улучшена с течением времени, и теперь имеет лучшую объяснения различных видах зависимостей: https://github.com/npm/cli/blob/latest/doc/files/package.json.md#devdependencies
Есть некоторые модули и пакеты, необходимые только для разработки, которые не нужны в производстве. Как сказано в документации:
Если кто-то планирует загрузить и использовать ваш модуль в своей программе, то он, вероятно, не хочет или не нуждается в загрузке и сборке внешнего фреймворка для тестирования или документации, который вы используете. В этом случае лучше всего перечислить эти дополнительные элементы в хэше devDependencies.
Простое объяснение, что сделало его более ясным для меня:
При развертывании вашего приложения, модули в зависимости должны быть установлены или вашем приложении выиграл'т работу. Модулей находится в devDependencies Дон'т должны быть установлены на рабочем сервере, поскольку вы'повторно не развивается на этой машине. ссылке
Я'd хотелось добавить к ответу мой взгляд на эти зависимости объяснений
зависимостей
используются для непосредственного использования в коде, вещи, которые обычно заканчиваются в производстве код, или куски кодаpeerDependencies
не'т достаточно смысла для меня, пока я читал этот фрагмент из блоге на тему Чиро упоминалось выше:
что [плагины] нужно-это способ выражения этих зависимостей между плагинами и их хост-пакет. Некоторые говорят: “Я работаю только при подключении до версии 1.2.х мой хозяин пакета, так что если вы установите меня, будьте уверены, что оно наряду с совместимый хост.” Мы называем эти отношения сверстников зависимостей.
peerDependencies
для плагинов, библиотек, которые требуют а "Хозяин" в библиотеке, чтобы выполнить свою функцию, но, возможно, были написаны в то время перед последняя версия хозяин был выпущен.
То есть, если я пишу PluginX В1
для HostLibraryX В3 и ходьбы, там's нет гарантия
PluginX В1работать
HostLibraryX В4(или даже
HostLibraryX В3.0.1`) выпущено.
С точки зрения плагина, это только добавляет функции принимающей библиотеки. Я не'т действительно "по необходимости" и хозяин, чтобы добавить зависимость на плагин, а плагины часто не'т буквально зависит от своего хозяина. Если вы Don'т иметь хост, плагин безвредно ничего не делает.
Это означает зависимостей
это'т действительно правильное понятие для плагинов.
Еще хуже, если бы мой хозяин был рассматривается как зависимость, мы'd в конечном итоге в этой ситуации то, что тот же блоге упоминает (отредактировал немного, чтобы использовать это ответ's сделал до узла & плагин):
но теперь, если мы рассматриваем современный вариант HostLibraryX как зависимость для PluginX,] запуск `результаты НПМ установить в неожиданных график зависимости
├── [email protected] └─┬ [email protected] └── [email protected]
Я оставлю тонкий неудачи плагин с помощью различных [HostLibraryX] API, чем основное применение своей фантазии.
... что's не суть плагинов. Теперь, если хозяин был достаточно хорош, чтобы включить информацию о зависимостях для всех своих плагинов, что'd не решит проблему, но что'd также ввести огромные новые культурные проблемы: модуль управления!
Вся суть плагинов заключается в том, что они могут паре анонимно. В идеальном мире, иметь хозяина управлять 'em все бы было аккуратно & аккуратное, но мы'вновь не собираюсь требовать стадо библиотеки кошек.
Вместо этого, у нас есть такое понятие, как сверстники. Ни хозяин, ни плагин сидит в другой'ы ведро зависимостей. Оба живут на одном уровне графа зависимостей.
Если я'м PluginX В1
и жду Пэр (то есть, есть peerDependency о) HostLibraryX В3, я'МР так сказать. Если вы'вэ автоматически обновлена до последней
HostLibraryX В4(заметим, что's версии ***4***) *и* у
плагина v1` установлен, вы должны знать, верно?
НПМ
может'т управлять этой ситуации для меня ...
"Эй, я вижу, вы're, используя
PluginX В1
! Я'm автоматическое понижение `HostLibraryX от В4 на В3, КК?&и"
... или...
"Эй я вижу, вы're, используя
PluginX В1
. Что ожидаетHostLibraryX В3
, что вы'вэ оставил в пыли во время своего последнего обновления. Чтобы быть безопасным, Я'm автоматическое удалениеплагина v1
!!1!
Как насчет нет, НПМ?!
Так что НПМ не'т. Он предупреждает Вас о ситуации, и позволяет выяснить, если HostLibraryX В4-это подходящий сверстников для плагина v1`.
Хорошее peerDependency управление в плагинов сделает эту концепцию работать более интуитивно, на практике. От блоге, еще раз...
один совет: требования к коллегиальной зависимости, в отличие от тех, для регулярных зависимостей, должны быть мягкими. Вы не должны заблокировать ваш коллегиального зависимости от конкретных версий патчей. Было бы очень неприятно, если один чай плагин сверстников-зависит от чай 1.4.1, а другой зависит от чай 1.5.0, просто потому, что авторам было лень и не тратить время на выяснение фактической минимальная версия чае они совместимы.
Короче
Зависимости - НПМ установить в <пакет> --сохранить-прод
устанавливает пакеты, необходимые для применения в производственной среде.
В разделе devDependencies - НПМ установить в <пакет> --сохранить-Дев
устанавливает
необходимые пакеты только для локальной разработки и тестирования
Просто набрав НПМ установки
устанавливает все пакеты, указанные в
пакет.в JSON
так что если вы работаете на локальном компьютере, просто введите `НПМ установить и продолжить :)
Зависимости против Дев зависимостей
Зависимости Дэв модули, которые нужны только во время разработки, тогда как зависимости необходимы во время выполнения. При развертывании вашего приложения, зависимости должны быть установлены, иначе приложение просто не будет работать. Библиотеки, которые вызываются из кода, который позволяет программе работать может рассматриваться в качестве зависимостей.
ЭГ - реагировать , реагируют - дом
Модули зависимость Дев не должны быть установлены на производстве, поскольку вы не собираетесь развиваться в этой машине .компиляторы, скрытых кода на JavaScript , тестирования и генераторы документ может рассматриваться как дев-зависимостей, так как они требуются только во время разработки .
Например - ESLint , Бабель , webpack
@Кстати,
mod-a
dev-dependents:
- mod-b
dependents:
- mod-c
mod-d
dev-dependents:
- mod-e
dependents:
- mod-a
----
npm install mod-d
installed modules:
- mod-d
- mod-a
- mod-c
----
checkout the mod-d code repository
npm install
installed modules:
- mod-a
- mod-c
- mod-e
Если вы публикуете на НПМ, то важно, что вы используете правильный флаг для правильного модулей. Если это то, что ваш НПМ модуль должен функционировать, а затем использовать в "--Сохранить как" флаг, чтобы сохранить модуль как зависимость. Если это то, что ваш модуль не'т нужно работать, но он нужен для тестирования, а затем использовать " и-сохранить-Дев, что" флаг.
# For dependent modules
npm install dependent-module --save
# For dev-dependent modules
npm install development-module --save-dev