Резюме важных различий в поведении:
dependencies
установлены на обоих:
npm install
из каталога, который содержит package.json
npm install $package
в любом другом каталоге
devDependencies
находятся:
- также установлен
npm install
в каталоге, который содержит package.json
, если вы не пропустите --production
флаг (см . ответ на вопрос Гаян Чарит ).
- не установлен
npm install "$package"
ни в каком другом каталоге, если вы не предоставите ему --dev
опцию.
- не установлены транзитивно.
peerDependencies
:
- до версии 3.0: всегда устанавливаются, если отсутствуют, и выдают ошибку, если различные несовместимые версии будут использовать несколько несовместимых версий зависимости.
- ожидается запуск с версии 3.0 (не проверено): при отсутствии предупреждения выдайте предупреждение
npm install
, и вам придется самостоятельно решить эту зависимость. При запуске, если зависимость отсутствует, вы получаете сообщение об ошибке (упомянуто @nextgentech )
Транзитивность (упомянутая Беном Хатчисоном ):
dependencies
устанавливаются транзитивно: если A требует B, а B требует C, то C устанавливается, в противном случае B не может работать, как и A.
devDependencies
не устанавливается транзитивно. Например, нам не нужно тестировать B для тестирования A, поэтому тестовые зависимости B могут быть опущены.
Связанные параметры здесь не обсуждаются:
devDependencies
dependencies
требуются для запуска, devDependencies
только для разработки, например: модульные тесты, преобразование CoffeeScript в JavaScript, минификация, ...
Если вы собираетесь разрабатывать пакет, вы загружаете его (например, через git clone
), переходите к его корню, который содержит package.json
, и запускаете:
npm install
Поскольку у вас есть фактический источник, ясно, что вы хотите его разработать, поэтому по умолчанию также устанавливаются как dependencies
(так как вы, конечно, должны работать для разработки), так и devDependency
зависимости.
Однако, если вы только конечный пользователь, который просто хочет установить пакет для его использования, вы будете делать это из любого каталога:
npm install "$package"
В этом случае, вы , как правило , не хотят зависимости развития, так что вы просто получить то , что нужно использовать пакет: dependencies
.
Если вы действительно хотите установить пакеты разработки в этом случае, вы можете установить параметр dev
конфигурации true
, возможно, из командной строки:
npm install "$package" --dev
Опция false
по умолчанию, так как это гораздо менее распространенный случай.
peerDependencies
(Протестировано до 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
peer зависят 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
это peer-dependency
- только
require('grunt')
под tests/
: он не используется программой.
Затем, когда пользователь будет использовать плагин, он будет неявно запрашивать плагин из Gruntfile
, добавив grunt.loadNpmTasks('grunt-contrib-uglify')
строку, но это то, grunt
что пользователь будет вызывать напрямую.
Это не сработало бы тогда, если бы каждому плагину требовалась отдельная версия Grunt.
Руководство
Я думаю, что документация достаточно хорошо отвечает на этот вопрос, возможно, вы недостаточно знакомы с менеджерами узлов / других пакетов. Я, наверное, понимаю это только потому, что немного знаю о Ruby-бандлере.
Ключевая строка:
Эти вещи будут установлены при выполнении npm link или npm install из корня пакета и могут управляться как любой другой параметр конфигурации npm. Смотрите npm-config (7) для более подробной информации по теме.
И тогда под npm-config (7) найдите dev
:
Default: false
Type: Boolean
Install dev-dependencies along with packages.
optionalDependencies
сейчас.