да, я запутался в этом - если вы используете непрерывную интеграцию, такую как Jenkins, знает ли Jenkins об использовании модулей devDependencies для запуска тестов? Я так полагаю, но это не супер очевидно.
Александр Миллс
5
возможно, измените вопрос, чтобы также сказать, какова функциональная разница между зависимостями и devDependencies?
Александр Миллс
5
Пакеты, установленные с помощью параметра --save-dev, не переустанавливаются при выполнении пользователем npm install --production. Это операционная разница (см. Https://docs.npmjs.com/cli/install для получения дополнительной информации).
Андрей
7
@MuhammadUmer Именно поэтому люди задают вопросы здесь - чтобы «получить ключ». Возможно, добавление реального ответа будет более продуктивным - это определенно интересное различие, о котором я не знал.
Simon_Weaver
3
Кроме того, если вы установите переменную среды NODE_ENVна производство, то npm installавтоматически исключите пакеты разработки.
Мухаммед Умер
Ответы:
592
--save-devиспользуется для сохранения пакета в целях разработки. Пример: юнит-тесты, минификация.
--save используется для сохранения пакета, необходимого для запуска приложения.
Насколько они разные? Когда я буду использовать один против другого? Могу ли я использовать этот пакет в производственном процессе, если он находится под --save-dev?
Дейв Войлес
14
Ответ кратко отвечает на ваши первые два вопроса. Ответ на последний вопрос: «Могу ли я использовать пакет в производстве, если он находится под --save-dev», - «нет». Хотя это, безусловно, возможно , это не предназначено.
Этот ответ удручающе расплывчат. Даже маленький пример помог бы сделать это более понятным.
Чойлтон Б. Хиггинботтом
33
Обратите внимание, что начиная с версии 5.0.0 npm, эта --saveопция больше не нужна. Если вы это сделаете npm install my-package, он добавит «my-package» в качестве зависимости в файл package.json.
Мартин Карел
644
Разница между --saveи --save-devможет быть не сразу заметна, если вы попробовали их обоих в своих проектах. Итак, вот несколько примеров ...
Допустим, вы создавали приложение, которое использовало пакет момента для анализа и отображения дат. Ваше приложение является планировщиком, поэтому ему действительно нужен этот пакет, как в: не может работать без него . В этом случае вы бы использовали
npm install moment --save
Это создаст новое значение в вашем package.json
"dependencies":{..."moment":"^2.17.1"}
Когда вы разрабатываете, это действительно помогает использовать такие инструменты, как наборы тестов, и может потребоваться ядро жасмина и карма . В этом случае вы бы использовали
Вам не нужен набор тестов для запуска приложения в его нормальном состоянии, так что это --save-devзависимость типа, не более того. Вы можете видеть, как, если вы не понимаете, что на самом деле происходит, это немного сложно представить.
Зависимости указываются в простом объекте, который сопоставляет имя пакета с диапазоном версий. Диапазон версий - это строка, содержащая один или несколько разделенных пробелами дескрипторов. Зависимости также могут быть идентифицированы с помощью tarball или git URL.
Пожалуйста, не помещайте тестовые жгуты или транспортеры в ваш объект зависимостей. Смотрите devDependencies ниже.
Даже в документах вам предлагается использовать --save-dev для таких модулей, как тестовые наборы.
ИМО, я думаю, что ключевое слово «сохранить» является проблемой. Почему они не делают флаг -dev для разработки и -deploy для развертывания. Это имеет смысл, чем ключевое слово «сохранить».
Тин Ву
1
Почему пакет просто не знает (не решает), является ли он релизным пакетом или пакетом dev и --save можно использовать для обоих. Кажется странным, что пользователь-установщик решает это, когда разработчик пакета создает намерение.
CodeGrue
4
CodeGrue, если вы используете jQuery только для тестирования компонентов React, он перейдет в save-dev, но на самом деле вы не можете использовать его для создания своего основного проекта. Да, это возможно Так почему же упаковщик знает, что вы делаете с ним?
Майкл Брюс
2
Намного понятнее Я - встраиваемый парень, впервые изучающий рабочий процесс Bootstra + Node.js. Не очевидно, в чем разница.
Leroy105
3
@YakovL save-dev означает, что пакеты не устанавливаются, когда кто-то другой устанавливает ваш пакет как свою зависимость. Пакеты, которые используются только для запуска сценариев, таких как start / build, в этом случае не понадобятся, поэтому они помещаются в dev-зависимости. Если вы работаете над веб-приложением, а не над пакетом, предназначенным для использования другими, вам, вероятно, не стоит об этом беспокоиться.
RIV
113
По умолчанию NPM просто устанавливает пакет в node_modules. Когда вы пытаетесь установить зависимости для вашего приложения / модуля, вам нужно будет сначала установить их, а затем добавить их в свой dependenciesраздел package.json.
--save-devдобавляет сторонний пакет к зависимостям разработки пакета. Он не будет установлен, когда кто-то установит ваш пакет. Обычно он устанавливается, только если кто-то клонирует ваш исходный репозиторий и запускает npm installего.
--saveдобавляет сторонний пакет в зависимости пакета. Он будет установлен вместе с пакетом всякий раз, когда кто-то запускается npm install package.
Dev-зависимости - это те зависимости, которые нужны только для разработки пакета. Сюда могут входить исполнители тестов, компиляторы, упаковщики и т. Д. Оба типа зависимостей хранятся в package.jsonфайле пакета . --saveдобавляет к dependencies, --save-devдобавляет кdevDependencies
С документацией по установке npm можно ознакомиться здесь.
Я подозревал, что это ... вы можете использовать --save-dev и --save взаимозаменяемо, если вы создаете веб-приложение, которое не станет пакетом, т.е. загружается из npm, если вы разрабатываете пакет для совместного использования с другими, это Важно понимать разницу.
VFein
13
Наконец-то спасибо вам, кто сказал, что его назначение при использовании npm install
CapturedTree
3
--save теперь по умолчанию с установкой npm с выпуском npm 5 в 2017 году
NattyC
подожди, зачем сложные предложения? В DevDependecy разработчик может установить пакеты, и он будет обновлен только devDevependency. Поэтому, когда новый разработчик клонирует кодовую базу проекта и запускает npm install => здесь только dependency package name is going to install.в node_modules .. не в пакете разработчика, как в Dev-зависимости.
Анупам Маурья
60
Прекрасный пример этого:
$ npm install typescript --save-dev
В этом случае вы хотели бы иметь Typescript (язык кодирования, разбираемый на javascript) для разработки, но после развертывания приложения это больше не требуется, так как весь код перенесен в javascript. Таким образом, не имеет смысла включать его в опубликованное приложение. На самом деле, это займет только место и увеличит время загрузки.
Что меня смущает, так это как это важно? Пакеты, сохраненные с помощью --save, по-прежнему сохраняются только в node_modulesпапке. Код не включен в развернутый сайт.
Кокодоко
6
@Kokodoko Когда вы используете --save-devфлаг, пакет добавляется к вашему devDependenciesобъекту. Если / когда кто-то устанавливает ваш пакет, все dependenciesзагружаются, но devDependenciesнет, так как они не требуются во время выполнения. Как говорится в ответе, это экономит их время и пространство. Разработчики, работающие с файлами вашего пакета, могут просто запустить его npm installв каталоге пакета devDependencies.
Джасджит Сингх Марва
Так что, если вы загружаете репозиторий с github и набираете его npm install, devDependenciesони игнорируются?
Кокодоко
41
Позвольте мне привести Вам пример,
Вы являетесь разработчиком очень СЕРЬЕЗНЫХ НПМ библиотеки . Который использует различные библиотеки тестирования для тестирования пакета.
Пользователь скачал вашу библиотеку и хочет использовать ее в своем коде. Нужно ли им загружать ваши тестовые библиотеки? Может быть, вы используете jestдля тестирования, и они используют mocha. Вы хотите, чтобы они также установили jest? Просто чтобы запустить вашу библиотеку?
Без прав? Вот почему они в devDependencies.
Когда кто-то это делает, будут установлены npm i yourPackageтолько библиотеки, необходимые для запуска вашей библиотеки. Другие библиотеки, которые вы использовали для связывания вашего кода или тестирования и макетов, не будут установлены, потому что вы их вставили devDependencies. Довольно аккуратно, верно?
Итак, почему разработчики должны выставлять devDependancies ?
Допустим, ваш пакет является пакетом с открытым исходным кодом, и сотни людей отправляют запросы на получение пакетов в ваш пакет. Тогда как они будут тестировать пакет? Они будут git cloneваши репо и когда они будут делать npm iв зависимости , а также devDependencies .
Потому что они не используют ваш пакет. Они продолжают разработку пакета, поэтому, чтобы протестировать ваш пакет, им нужно пройти существующие тестовые случаи, а также написать новый. Поэтому им нужно использовать вашу devDependenciesбиблиотеку, которая содержит все библиотеки тестирования / сборки / проверки, которые вы использовали.
Если кто-то планирует загрузить и использовать ваш модуль в своей программе, то он, вероятно, не хочет или не нуждается в загрузке и создании используемой вами среды внешнего тестирования или документации.
Однако для разработки веб-приложений Yeoman (инструмент скаффолдинга, который среди прочего устанавливает предварительно проверенный предварительно написанный файл package.json) помещает все пакеты в devDependencies и ничего в зависимости, поэтому кажется, что использование --save-dev- безопасная ставка в разработке веб-приложений , по крайней мере.
Обратите внимание, что у меня возникли проблемы при использовании gulp и установке пакетов, --save-devкогда пакет не установил требуемые зависимости. Запуск --saveустановил эти недостающие зависимости.
Ник М
18
Я также хотел бы отметить, что я сейчас использую --saveдля всех, кроме тестовых и документальных зависимостей (согласно документации npm). Я начинаю думать, что йоменский пример, который я упоминал выше, не является хорошим примером лучшей практики.
wayfarer_boy
Я тоже так думаю, зачем вам когда-нибудь нужно, --save-devстановится все менее понятным с каждым ответом здесь :)
Kokodoko
20
--save-devсохраняет спецификацию semver в массиве «devDependencies» в файле дескриптора пакета, --saveвместо этого сохраняет его в «зависимости».
этот ответ имеет для меня наибольшее значение, тогда devDependencies требуются для разработки, но не для производства, поэтому htmllint, sass-компиляция и т. д. и Dependencies - для производственных требований, таких как Diaporama, которые должны присутствовать для запуска.
Миллер горилла
3
@ahnbizcad Ответ здесь лучше, но основное функциональное отличие состоит в том, что devDependencies не включены транзитивно.
Пейс
Разве это не самый интуитивно понятный способ описать это для кого-то, кто этого еще не знает ?: Dev --save-devделает пакеты локальными для вашего проекта, тогда как --saveделает их локальными для вашей установки узла?
августа
9
Четкие ответы уже предоставлены. Но стоит упомянуть, как devDependenciesвлияет установка пакетов:
По умолчанию, установка npm установит все модули, перечисленные как зависимости в package.json. С флагом --production (или когда для переменной среды NODE_ENV установлено значение production), npm не будет устанавливать модули, перечисленные в devDependencies.
--save-dev используется для модулей, используемых при разработке приложения, не требуется при его запуске в производственной среде
--save используется для добавления его в package.json и требуется для запуска приложения.
Пример: express, body-parser, lodash, шлем, mysql - все это используется при запуске приложения - сохранить для зависимости, а mocha, istanbul, chai, sonarqube-scanner - во время разработки, поэтому поместите их в dev -зависимости.
npm link или npm install также установят модули dev-зависимостей вместе с модулями зависимостей в папку вашего проекта.
Все объяснения здесь хороши, но в них нет очень важной вещи: как установить только производственные зависимости? (без зависимостей разработки). Мы отделяем dependenciesот devDependenciesиспользования --saveили --save-dev. Для установки всего мы используем:
npm i
Для установки только производственных пакетов мы должны использовать:
Люди используют npm на производстве, чтобы делать злые классные вещи, например, Node.js, так что вам не нужно запускать все ваши инструменты разработки.
Если вы используете gulp (или аналогичный) для создания файлов сборки для размещения на вашем сервере, это не имеет значения.
npm install --production
. Это операционная разница (см. Https://docs.npmjs.com/cli/install для получения дополнительной информации).NODE_ENV
на производство, тоnpm install
автоматически исключите пакеты разработки.Ответы:
--save-dev
используется для сохранения пакета в целях разработки. Пример: юнит-тесты, минификация.--save
используется для сохранения пакета, необходимого для запуска приложения.источник
-D
сокращенно--save-dev
и-S
сокращенно--save
--save
опция больше не нужна. Если вы это сделаетеnpm install my-package
, он добавит «my-package» в качестве зависимости в файл package.json.Разница между
--save
и--save-dev
может быть не сразу заметна, если вы попробовали их обоих в своих проектах. Итак, вот несколько примеров ...Допустим, вы создавали приложение, которое использовало пакет момента для анализа и отображения дат. Ваше приложение является планировщиком, поэтому ему действительно нужен этот пакет, как в: не может работать без него . В этом случае вы бы использовали
Это создаст новое значение в вашем package.json
Когда вы разрабатываете, это действительно помогает использовать такие инструменты, как наборы тестов, и может потребоваться ядро жасмина и карма . В этом случае вы бы использовали
Это также создаст новое значение в вашем package.json
Вам не нужен набор тестов для запуска приложения в его нормальном состоянии, так что это
--save-dev
зависимость типа, не более того. Вы можете видеть, как, если вы не понимаете, что на самом деле происходит, это немного сложно представить.Взят напрямую из NPM docs docs # зависимости
Даже в документах вам предлагается использовать --save-dev для таких модулей, как тестовые наборы.
Я надеюсь, что это помогает и понятно.
источник
По умолчанию NPM просто устанавливает пакет в node_modules. Когда вы пытаетесь установить зависимости для вашего приложения / модуля, вам нужно будет сначала установить их, а затем добавить их в свой
dependencies
разделpackage.json
.--save-dev
добавляет сторонний пакет к зависимостям разработки пакета. Он не будет установлен, когда кто-то установит ваш пакет. Обычно он устанавливается, только если кто-то клонирует ваш исходный репозиторий и запускаетnpm install
его.--save
добавляет сторонний пакет в зависимости пакета. Он будет установлен вместе с пакетом всякий раз, когда кто-то запускаетсяnpm install package
.Dev-зависимости - это те зависимости, которые нужны только для разработки пакета. Сюда могут входить исполнители тестов, компиляторы, упаковщики и т. Д. Оба типа зависимостей хранятся в
package.json
файле пакета .--save
добавляет кdependencies
,--save-dev
добавляет кdevDependencies
С документацией по установке npm можно ознакомиться здесь.
источник
dependency package name is going to install.
в node_modules .. не в пакете разработчика, как в Dev-зависимости.Прекрасный пример этого:
В этом случае вы хотели бы иметь Typescript (язык кодирования, разбираемый на javascript) для разработки, но после развертывания приложения это больше не требуется, так как весь код перенесен в javascript. Таким образом, не имеет смысла включать его в опубликованное приложение. На самом деле, это займет только место и увеличит время загрузки.
источник
--save
, по-прежнему сохраняются только вnode_modules
папке. Код не включен в развернутый сайт.--save-dev
флаг, пакет добавляется к вашемуdevDependencies
объекту. Если / когда кто-то устанавливает ваш пакет, всеdependencies
загружаются, ноdevDependencies
нет, так как они не требуются во время выполнения. Как говорится в ответе, это экономит их время и пространство. Разработчики, работающие с файлами вашего пакета, могут просто запустить егоnpm install
в каталоге пакетаdevDependencies
.npm install
,devDependencies
они игнорируются?Позвольте мне привести Вам пример,
jest
для тестирования, и они используютmocha
. Вы хотите, чтобы они также установилиjest
? Просто чтобы запустить вашу библиотеку?Без прав? Вот почему они в
devDependencies
.Когда кто-то это делает, будут установлены
npm i yourPackage
только библиотеки, необходимые для запуска вашей библиотеки. Другие библиотеки, которые вы использовали для связывания вашего кода или тестирования и макетов, не будут установлены, потому что вы их вставилиdevDependencies
. Довольно аккуратно, верно?Итак, почему разработчики должны выставлять devDependancies ?
Допустим, ваш пакет является пакетом с открытым исходным кодом, и сотни людей отправляют запросы на получение пакетов в ваш пакет. Тогда как они будут тестировать пакет? Они будут
git clone
ваши репо и когда они будут делатьnpm i
в зависимости , а также devDependencies .Потому что они не используют ваш пакет. Они продолжают разработку пакета, поэтому, чтобы протестировать ваш пакет, им нужно пройти существующие тестовые случаи, а также написать новый. Поэтому им нужно использовать вашу
devDependencies
библиотеку, которая содержит все библиотеки тестирования / сборки / проверки, которые вы использовали.источник
Как предложено @ andreas-hultgren в этом ответе и в соответствии с документами npm :
Однако для разработки веб-приложений Yeoman (инструмент скаффолдинга, который среди прочего устанавливает предварительно проверенный предварительно написанный файл package.json) помещает все пакеты в devDependencies и ничего в зависимости, поэтому кажется, что использование
--save-dev
- безопасная ставка в разработке веб-приложений , по крайней мере.источник
--save-dev
когда пакет не установил требуемые зависимости. Запуск--save
установил эти недостающие зависимости.--save
для всех, кроме тестовых и документальных зависимостей (согласно документации npm). Я начинаю думать, что йоменский пример, который я упоминал выше, не является хорошим примером лучшей практики.--save-dev
становится все менее понятным с каждым ответом здесь :)--save-dev
сохраняет спецификацию semver в массиве «devDependencies» в файле дескриптора пакета,--save
вместо этого сохраняет его в «зависимости».источник
--save-dev
делает пакеты локальными для вашего проекта, тогда как--save
делает их локальными для вашей установки узла?Четкие ответы уже предоставлены. Но стоит упомянуть, как
devDependencies
влияет установка пакетов:Смотрите: https://docs.npmjs.com/cli/install
источник
Как правило, вы не хотите наполнять производственный пакет вещами, которые вы намерены использовать только в целях разработки.
Используйте
--save-dev
(или-D
) опцию для разделения пакетов, таких как рамки модульного тестирования (шут, жасмин, мокко, чай и т. Д.)Любые другие пакеты, которые нужны вашему приложению для производства, должны быть установлены с помощью
--save
(или-S
).Если вы откроете
package.json
файл, то увидите эти записи в двух разных разделах:источник
--save-dev используется для модулей, используемых при разработке приложения, не требуется при его запуске в производственной среде --save используется для добавления его в package.json и требуется для запуска приложения.
Пример: express, body-parser, lodash, шлем, mysql - все это используется при запуске приложения - сохранить для зависимости, а mocha, istanbul, chai, sonarqube-scanner - во время разработки, поэтому поместите их в dev -зависимости.
npm link или npm install также установят модули dev-зависимостей вместе с модулями зависимостей в папку вашего проекта.
источник
Все объяснения здесь хороши, но в них нет очень важной вещи: как установить только производственные зависимости? (без зависимостей разработки). Мы отделяем
dependencies
отdevDependencies
использования--save
или--save-dev
. Для установки всего мы используем:Для установки только производственных пакетов мы должны использовать:
источник
Я хочу добавить некоторые мои идеи как
Я думаю, что все различия появятся, когда кто-то использует ваши коды вместо того, чтобы использовать самостоятельно
Например, вы пишете HTTP-библиотеку
node's request
В вашей библиотеке
вы использовали lodash для обработки строк и объектов, без lodash ваши коды не могут работать
Если кто-то использует вашу HTTP-библиотеку как часть своего кода. Ваши коды будут скомпилированы с его.
ваши коды нужны lodash, так что вам нужно положить в
dependencies
для компиляцииЕсли вы пишете проект, как
monaco-editor
, который является веб-редактором,у вас есть все ваши коды и ваш
product env library
веб-пакет, когда сборка завершена, есть толькоmonaco-min.js
Так что кто-то не может ли
--save
или--save-dependencies
только ему нужноmonaco-min.js
Резюме:
Если кто-то хочет скомпилировать ваши коды (использовать в качестве библиотеки),
lodash
укажите , какие коды используются в них.dependencies
Если кто-то хочет добавить больше функций к вашим кодам, он должен
unit test
иcompiler
поместить их вdev-dependencies
источник
Люди используют npm на производстве, чтобы делать злые классные вещи, например, Node.js, так что вам не нужно запускать все ваши инструменты разработки.
Если вы используете gulp (или аналогичный) для создания файлов сборки для размещения на вашем сервере, это не имеет значения.
источник