Эта документация очень плохо отвечает на мой вопрос. Я не понял этих объяснений. Кто-то может сказать более простыми словами? Может быть, с примерами, если трудно выбрать простые слова?
EDIT также добавил peerDependencies
, что тесно связано и может привести к путанице.
optionalDependencies
сейчас.Ответы:
Резюме важных различий в поведении:
dependencies
установлены на обоих:npm install
из каталога, который содержитpackage.json
npm install $package
в любом другом каталогеdevDependencies
находятся:npm install
в каталоге, который содержитpackage.json
, если вы не пропустите--production
флаг (см . ответ на вопрос Гаян Чарит ).npm install "$package"
ни в каком другом каталоге, если вы не предоставите ему--dev
опцию.peerDependencies
:npm install
, и вам придется самостоятельно решить эту зависимость. При запуске, если зависимость отсутствует, вы получаете сообщение об ошибке (упомянуто @nextgentech )Транзитивность (упомянутая Беном Хатчисоном ):
dependencies
устанавливаются транзитивно: если A требует B, а B требует C, то C устанавливается, в противном случае B не может работать, как и A.devDependencies
не устанавливается транзитивно. Например, нам не нужно тестировать B для тестирования A, поэтому тестовые зависимости B могут быть опущены.Связанные параметры здесь не обсуждаются:
bundledDependencies
который обсуждается по следующему вопросу: Преимущества bundledDependencies по сравнению с обычными зависимостями в NPMoptionalDependencies
(упомянуто Эйданом Фельдманом )devDependencies
dependencies
требуются для запуска,devDependencies
только для разработки, например: модульные тесты, преобразование CoffeeScript в JavaScript, минификация, ...Если вы собираетесь разрабатывать пакет, вы загружаете его (например, через
git clone
), переходите к его корню, который содержитpackage.json
, и запускаете:Поскольку у вас есть фактический источник, ясно, что вы хотите его разработать, поэтому по умолчанию также устанавливаются как
dependencies
(так как вы, конечно, должны работать для разработки), так иdevDependency
зависимости.Однако, если вы только конечный пользователь, который просто хочет установить пакет для его использования, вы будете делать это из любого каталога:
В этом случае, вы , как правило , не хотят зависимости развития, так что вы просто получить то , что нужно использовать пакет:
dependencies
.Если вы действительно хотите установить пакеты разработки в этом случае, вы можете установить параметр
dev
конфигурацииtrue
, возможно, из командной строки:Опция
false
по умолчанию, так как это гораздо менее распространенный случай.peerDependencies
(Протестировано до 3.0)
Источник: https://nodejs.org/en/blog/npm/peer-dependencies/
С обычными зависимостями вы можете иметь несколько версий зависимости: она просто устанавливается внутри
node_modules
зависимости.Например, если
dependency1
и то иdependency2
другое зависит отdependency3
разных версий, дерево проекта будет выглядеть так:Плагины, однако, являются пакетами, которые обычно не требуют другого пакета, который в этом контексте называется хостом . Вместо:
Например, если
dependency1
иdependency2
peer зависятdependency3
, дерево проекта будет выглядеть так:Это происходит, даже если вы никогда не упоминаете
dependency3
в своемpackage.json
файле.Я думаю, что это пример шаблона проектирования Inversion of Control .
Прототипом примера одноранговых зависимостей является Grunt, хост и его плагины.
Например, на плагине Grunt, таком как https://github.com/gruntjs/grunt-contrib-uglify , вы увидите, что:
grunt
этоpeer-dependency
require('grunt')
подtests/
: он не используется программой.Затем, когда пользователь будет использовать плагин, он будет неявно запрашивать плагин из
Gruntfile
, добавивgrunt.loadNpmTasks('grunt-contrib-uglify')
строку, но это то,grunt
что пользователь будет вызывать напрямую.Это не сработало бы тогда, если бы каждому плагину требовалась отдельная версия Grunt.
Руководство
Я думаю, что документация достаточно хорошо отвечает на этот вопрос, возможно, вы недостаточно знакомы с менеджерами узлов / других пакетов. Я, наверное, понимаю это только потому, что немного знаю о Ruby-бандлере.
Ключевая строка:
И тогда под npm-config (7) найдите
dev
:источник
npm install package
это команда, которую вы будете использовать для установки всех пакетов, которые не являются dev-зависимостями, а не то, что, как я теперь думаю, вы имели в виду, - это «установка пакета под названием [package]», как я и думал. прежде чем читать это. Если бы я был тобой, я бы отредактировал, чтобы сказать [имя-пакета], что ясно показывает, что ты имеешь в виду «вставить-имя-здесь».peerDependencies
поведение в предстоящем npm @ 3. От blog.npmjs.org/post/110924823920/npm-weekly-5 : «Мы больше не будем автоматически загружать зависимость от однорангового узла. Вместо этого мы будем предупреждать вас, если зависимость от однорангового узла еще не установлена. Это требует от вас разрешать конфликты peerDependency самостоятельно, вручную, но в долгосрочной перспективе это снизит вероятность того, что вы окажетесь в затруднительном положении с зависимостями ваших пакетов. "npm install
из пакета A, вы получите B и C, но не D.devDependencies
они не установлены, когдаNODE_ENV
установлено значениеproduction
.Если вы не хотите устанавливать devDependencies, вы можете использовать
npm install --production
источник
--save
опция больше не нужна. Если вы выполните «npm install my-package», он добавит my-package в качестве зависимости в вашpackage.json
файл.В качестве примера, mocha обычно представляет собой devDependency, поскольку тестирование не требуется в производственной среде, тогда как express будет зависимостью.
источник
Зависимости
Зависимости, которые должен запускать ваш проект, например, библиотека, предоставляющая функции, которые вы вызываете из своего кода.
Они устанавливаются транзитивно (если A зависит от B, зависит от C, npm install на A установит B и C).
Пример: lodash: ваш проект вызывает некоторые функции lodash.
devDependencies
Зависимости, которые вам нужны только во время разработки или выпуска, например, компиляторы, которые берут ваш код и компилируют его в javascript, тестовые среды или генераторы документации.
Они не устанавливаются транзитивно (если A зависит от B, dev зависит от C, npm install на A будет устанавливать только B).
Пример: grunt: ваш проект использует grunt для сборки самого себя.
peerDependencies
Зависимости, которые ваш проект подключает или изменяет в родительском проекте, обычно это плагин для какой-то другой библиотеки или инструмента. Он просто предназначен для проверки того, что родительский проект (проект, который будет зависеть от вашего проекта) зависит от проекта, к которому вы подключаетесь. Таким образом, если вы создаете плагин C, который добавляет функциональность в библиотеку B, то кто-то, создающий проект A, должен будет иметь зависимость от B, если у него есть зависимость от C.
Они не установлены (если npm <3), они только проверено на
Пример: grunt: ваш проект добавляет функциональность к grunt и может использоваться только в проектах, которые используют grunt.
Эта документация действительно хорошо объясняет зависимости от сверстников: https://nodejs.org/en/blog/npm/peer-dependencies/
Кроме того, документация по npm была улучшена с течением времени, и теперь она содержит более подробные объяснения различных типов зависимостей: https://github.com/npm/cli/blob/latest/doc/files/package.json.md#devdependencies
источник
Чтобы сохранить пакет в package.json как зависимости dev:
При запуске
npm install
он установит обаdevDependencies
иdependencies
. Чтобы избежать установки,devDependencies
выполните:источник
Есть некоторые модули и пакеты, необходимые только для разработки, которые не нужны в производстве. Как сказано в документации :
источник
Простое объяснение, которое сделало его более ясным для меня:
При развертывании приложения необходимо установить модули в зависимостях, иначе ваше приложение не будет работать. Модули в devDependencies не нужно устанавливать на рабочий сервер, так как вы не разрабатываете на этом компьютере. ссылка на сайт
источник
vendor.js
, все наши команды должны быть разработчиками, если скомпилированный код будет добавлен в репозиторий ? И это должно быть зафиксировано, так как в других случаях странно, что вы должны скомпилировать модуль, а не просто установить его (и тестирование также где-то здесь, так как любое изменение в подмодулях может привести к регрессии) ...webpack -p
я имею в виду. пожалуйста, ответь на мой вопрос.Я хотел бы добавить к ответу мой взгляд на объяснения этих зависимостей
dependencies
используются для непосредственного использования в вашей кодовой базе, вещах, которые обычно заканчиваются в производственном коде, или фрагментам кодаdevDependencies
используются для процесса сборки, инструменты, которые помогают вам управлять конечным кодом, сторонние тестовые модули (например, веб-пакеты)источник
Короче говоря
Зависимости -
npm install <package> --save-prod
устанавливает пакеты, необходимые для вашего приложения, в производственную среду.DevDependencies -
npm install <package> --save-dev
устанавливает пакеты, необходимые только для локальной разработки и тестированияПросто печатать
npm install
установит все пакеты, упомянутые в package.jsonтак что если вы работаете на локальном компьютере, просто наберите
npm install
и продолжайте :)источник
peerDependencies
не совсем имело для меня смысл, пока я не прочитал этот фрагмент из поста в блоге на тему Ciro, упомянутую выше :Плагин действительно ожидает конкретную версию хоста ...
peerDependencies
предназначены для плагинов, библиотек, которым для выполнения своих функций требуется библиотека «хост», но, возможно, они были написаны за время до выпуска последней версии хоста.То есть, если я пишу
PluginX v1
дляHostLibraryX v3
и уйти, нет никакой гарантии ,PluginX v1
не будет работать , когдаHostLibraryX v4
(или дажеHostLibraryX v3.0.1
) освобождается.... но плагин не зависит от хоста ...
С точки зрения плагина, он только добавляет функции в библиотеку хоста. Мне на самом деле не «нужен» хост, чтобы добавить зависимость к плагину, и плагины часто буквально не зависят от своего хоста. Если у вас нет хоста, плагин безвредно ничего не делает.
Это означает,
dependencies
что на самом деле не правильная концепция для плагинов.Еще хуже, если бы к моему хосту относились как к зависимости, мы бы оказались в такой ситуации, о которой упоминается в том же посте в блоге (отредактировано немного, чтобы использовать этот ответ, составленный host & plugin):
... и хост, очевидно, не зависит от плагина ...
... в этом весь смысл плагинов. Теперь, если хост достаточно хорош, чтобы включить информацию о зависимостях для всех своих плагинов, это решит проблему, но это также создаст огромную культурную проблему : управление плагинами!
Весь смысл плагинов в том, что они могут соединяться анонимно. В идеальном мире, если бы хозяин управлял ими, все было бы аккуратно и аккуратно, но мы не собираемся требовать библиотек со стадами кошек.
Если мы не зависимы от иерархии, может быть, мы внутризависимые коллеги ...
Вместо этого у нас есть концепция равных. Ни хост, ни плагин не находятся в корзине зависимостей другого. Оба живут на одном уровне графа зависимостей.
... но это не автоматические отношения. <<< Moneyball !!!
Если я
PluginX v1
и ожидаю сверстника (то есть иметь взаимную зависимость )HostLibraryX v3
, я так и скажу. Если вы автоматически обновлены до последнейHostLibraryX v4
(обратите внимание , что это версия 4 ) И ужеPlugin v1
установлена, вы должны знать, правильно?npm
не могу справиться с этой ситуацией для меня -... или...
Как насчет нет, нпм ?!
Так что npm не делает. Он предупреждает вас о ситуации и позволяет выяснить,
HostLibraryX v4
подходит ли вам этот узелPlugin v1
.кода
Хорошее
peerDependency
управление плагинами сделает эту концепцию более интуитивно понятной на практике. Из сообщения в блоге , еще раз ...источник
Зависимости против dev-зависимостей
Dev-зависимости - это модули, которые требуются только во время разработки, тогда как зависимости требуются во время выполнения. Если вы развертываете свое приложение, необходимо установить зависимости, иначе ваше приложение просто не будет работать. Библиотеки, которые вы вызываете из своего кода, который позволяет запускать программу, могут рассматриваться как зависимости.
Например, реагировать, реагировать - дом
Модули зависимостей Dev не нужно устанавливать на рабочем сервере, так как вы не собираетесь разрабатывать на этом компьютере .компиляторы, которые преобразуют ваш код в javascript, тестовые среды и генераторы документов могут рассматриваться как dev-зависимости, так как они требуются только во время разработки.
Например, ESLint, Babel, веб-пакет
@FYI,
Если вы публикуете в npm, важно, чтобы вы использовали правильный флаг для правильных модулей. Если это то, что ваш модуль npm должен функционировать, то используйте флаг "--save", чтобы сохранить модуль как зависимость. Если это то, что вашему модулю не нужно функционировать, но оно необходимо для тестирования, используйте флаг «--save-dev».
источник
При попытке распространения пакета npm вам следует избегать его использования
dependencies
. Вместо этого вам нужно рассмотреть возможность добавленияpeerDependencies
или удаленияdependencies
.источник
Я нашел простое объяснение.
Короткий ответ:
зависимости "... это те, которые ваш проект действительно должен иметь возможность работать в производстве".
devDependencies "... это те, которые вам нужны во время разработки".
peerDependencies "если вы хотите создать и опубликовать свою собственную библиотеку, чтобы она могла использоваться как зависимость"
Более подробно в этом посте: https://code-trotter.com/web/dependencies-vs-devdependencies-vs-peerdependencies
источник