В чем разница между --save и --save-dev?

747

В чем разница между:

npm install [package_name] --save

а также:

npm install [package_name] --save-dev

Что это значит?

nfort
источник
4
да, я запутался в этом - если вы используете непрерывную интеграцию, такую ​​как 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 используется для сохранения пакета, необходимого для запуска приложения.
Туонг Ле
источник
150
Насколько они разные? Когда я буду использовать один против другого? Могу ли я использовать этот пакет в производственном процессе, если он находится под --save-dev?
Дейв Войлес
14
Ответ кратко отвечает на ваши первые два вопроса. Ответ на последний вопрос: «Могу ли я использовать пакет в производстве, если он находится под --save-dev», - «нет». Хотя это, безусловно, возможно , это не предназначено.
Технеций
62
Сокращенные версии: -Dсокращенно --save-devи -Sсокращенно--save
chrisco
164
Этот ответ удручающе расплывчат. Даже маленький пример помог бы сделать это более понятным.
Чойлтон Б. Хиггинботтом
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"
}

Когда вы разрабатываете, это действительно помогает использовать такие инструменты, как наборы тестов, и может потребоваться ядро жасмина и карма . В этом случае вы бы использовали

npm install jasmine-core --save-dev
npm install karma --save-dev

Это также создаст новое значение в вашем package.json

"devDependencies": {
    ...
    "jasmine-core": "^2.5.2",
    "karma": "^1.4.1",
}

Вам не нужен набор тестов для запуска приложения в его нормальном состоянии, так что это --save-devзависимость типа, не более того. Вы можете видеть, как, если вы не понимаете, что на самом деле происходит, это немного сложно представить.

Взят напрямую из NPM docs docs # зависимости

зависимости

Зависимости указываются в простом объекте, который сопоставляет имя пакета с диапазоном версий. Диапазон версий - это строка, содержащая один или несколько разделенных пробелами дескрипторов. Зависимости также могут быть идентифицированы с помощью tarball или git URL.

Пожалуйста, не помещайте тестовые жгуты или транспортеры в ваш объект зависимостей. Смотрите devDependencies ниже.

Даже в документах вам предлагается использовать --save-dev для таких модулей, как тестовые наборы.

Я надеюсь, что это помогает и понятно.

Майкл Брюс
источник
15
ИМО, я думаю, что ключевое слово «сохранить» является проблемой. Почему они не делают флаг -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 можно ознакомиться здесь.

Лакшми Света Г
источник
37
Я подозревал, что это ... вы можете использовать --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. Таким образом, не имеет смысла включать его в опубликованное приложение. На самом деле, это займет только место и увеличит время загрузки.

Jackalope
источник
4
То же самое касается: «$ npm install grunt --save-dev», так как это полезно для разработки, но не для развертывания.
Jackalope
1
Примечание: Microsoft предлагает устанавливать пакеты @ types / xxx как зависимости, а не devDependencies github.com/Microsoft/types-publisher/issues/81
Дейв
2
Что меня смущает, так это как это важно? Пакеты, сохраненные с помощью --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библиотеку, которая содержит все библиотеки тестирования / сборки / проверки, которые вы использовали.

Аритра Чакраборты
источник
8
Гораздо лучше, чем принятый ответ, а также ответ с максимальным количеством голосов, поскольку этот ответ носит более практический характер. Спасибо!
Uncaught Exception
Это должен быть выбранный ответ. Все остальные ответы на самом деле не объясняют, ПОЧЕМУ вы бы использовали один над другим.
Рокки Кев
34

Как предложено @ andreas-hultgren в этом ответе и в соответствии с документами npm :

Если кто-то планирует загрузить и использовать ваш модуль в своей программе, то он, вероятно, не хочет или не нуждается в загрузке и создании используемой вами среды внешнего тестирования или документации.

Однако для разработки веб-приложений Yeoman (инструмент скаффолдинга, который среди прочего устанавливает предварительно проверенный предварительно написанный файл package.json) помещает все пакеты в devDependencies и ничего в зависимости, поэтому кажется, что использование --save-dev- безопасная ставка в разработке веб-приложений , по крайней мере.

wayfarer_boy
источник
3
Обратите внимание, что у меня возникли проблемы при использовании gulp и установке пакетов, --save-devкогда пакет не установил требуемые зависимости. Запуск --saveустановил эти недостающие зависимости.
Ник М
18
Я также хотел бы отметить, что я сейчас использую --saveдля всех, кроме тестовых и документальных зависимостей (согласно документации npm). Я начинаю думать, что йоменский пример, который я упоминал выше, не является хорошим примером лучшей практики.
wayfarer_boy
Я тоже так думаю, зачем вам когда-нибудь нужно, --save-devстановится все менее понятным с каждым ответом здесь :)
Kokodoko
20

--save-devсохраняет спецификацию semver в массиве «devDependencies» в файле дескриптора пакета, --saveвместо этого сохраняет его в «зависимости».

Алекс
источник
83
а в чем функциональная разница?
ahnbizcad
6
этот ответ имеет для меня наибольшее значение, тогда devDependencies требуются для разработки, но не для производства, поэтому htmllint, sass-компиляция и т. д. и Dependencies - для производственных требований, таких как Diaporama, которые должны присутствовать для запуска.
Миллер горилла
3
@ahnbizcad Ответ здесь лучше, но основное функциональное отличие состоит в том, что devDependencies не включены транзитивно.
Пейс
Разве это не самый интуитивно понятный способ описать это для кого-то, кто этого еще не знает ?: Dev --save-devделает пакеты локальными для вашего проекта, тогда как --saveделает их локальными для вашей установки узла?
августа
9

Четкие ответы уже предоставлены. Но стоит упомянуть, как devDependenciesвлияет установка пакетов:

По умолчанию, установка npm установит все модули, перечисленные как зависимости в package.json. С флагом --production (или когда для переменной среды NODE_ENV установлено значение production), npm не будет устанавливать модули, перечисленные в devDependencies.

Смотрите: https://docs.npmjs.com/cli/install

Алиреза
источник
8

Как правило, вы не хотите наполнять производственный пакет вещами, которые вы намерены использовать только в целях разработки.

Используйте --save-dev(или -D) опцию для разделения пакетов, таких как рамки модульного тестирования (шут, жасмин, мокко, чай и т. Д.)

Любые другие пакеты, которые нужны вашему приложению для производства, должны быть установлены с помощью --save(или -S).

npm install --save lodash       //prod dependency
npm install -S moment           // "       "
npm install -S opentracing      // "       "

npm install -D jest                 //dev only dependency
npm install --save-dev typescript   //dev only dependency

Если вы откроете package.jsonфайл, то увидите эти записи в двух разных разделах:

"dependencies": {
  "lodash": "4.x",
  "moment": "2.x",
  "opentracing": "^0.14.1"
},

"devDependencies": {
    "jest": "22.x",
    "typescript": "^2.8.3"
},
velhala
источник
5

--save-dev используется для модулей, используемых при разработке приложения, не требуется при его запуске в производственной среде --save используется для добавления его в package.json и требуется для запуска приложения.

Пример: express, body-parser, lodash, шлем, mysql - все это используется при запуске приложения - сохранить для зависимости, а mocha, istanbul, chai, sonarqube-scanner - во время разработки, поэтому поместите их в dev -зависимости.

npm link или npm install также установят модули dev-зависимостей вместе с модулями зависимостей в папку вашего проекта.

Biswadev
источник
3

Все объяснения здесь хороши, но в них нет очень важной вещи: как установить только производственные зависимости? (без зависимостей разработки). Мы отделяем dependenciesот devDependenciesиспользования --saveили --save-dev. Для установки всего мы используем:

npm i

Для установки только производственных пакетов мы должны использовать:

npm i --only=production
Ронни Шерер
источник
0

Я хочу добавить некоторые мои идеи как

Я думаю, что все различия появятся, когда кто-то использует ваши коды вместо того, чтобы использовать самостоятельно

Например, вы пишете HTTP-библиотеку node's request

В вашей библиотеке

вы использовали lodash для обработки строк и объектов, без lodash ваши коды не могут работать

Если кто-то использует вашу HTTP-библиотеку как часть своего кода. Ваши коды будут скомпилированы с его.

ваши коды нужны lodash, так что вам нужно положить в dependenciesдля компиляции


Если вы пишете проект, как monaco-editor, который является веб-редактором,

у вас есть все ваши коды и ваш product env libraryвеб-пакет, когда сборка завершена, есть толькоmonaco-min.js

Так что кто-то не может ли --saveили --save-dependenciesтолько ему нужноmonaco-min.js

Резюме:

  1. Если кто-то хочет скомпилировать ваши коды (использовать в качестве библиотеки), lodashукажите , какие коды используются в них.dependencies

  2. Если кто-то хочет добавить больше функций к вашим кодам, он должен unit testи compilerпоместить их вdev-dependencies

ириска
источник
0

Люди используют npm на производстве, чтобы делать злые классные вещи, например, Node.js, так что вам не нужно запускать все ваши инструменты разработки.

Если вы используете gulp (или аналогичный) для создания файлов сборки для размещения на вашем сервере, это не имеет значения.

Tristanisginger
источник