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

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

npm install [имя_пакета] --save

и

npm install [имя_пакета] --save-dev

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

Ответ 1

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

Ответ 2

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

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

npm install moment --save

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

"dependencies": {
   ...
   "moment": "^2.17.1"
}

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

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 Документация # зависимости

Dependencies

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

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

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

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

Ответ 3

По умолчанию NPM просто устанавливает пакет под node_modules. Когда вы пытаетесь установить зависимости для своего приложения/модуля, вам нужно будет сначала установить их, а затем добавить их в раздел dependencies вашего package.json.

--save-dev добавляет сторонний пакет к зависимостям разработки пакетов. Он не будет установлен, если кто-то установит ваш пакет. Он обычно устанавливается только в том случае, если кто-то клонирует ваш исходный репозиторий и запускает в нем npm install.

--save добавляет сторонний пакет к зависимостям пакета. Он будет установлен вместе с пакетом, когда кто-то запускает npm install package.

зависимостями Dev являются те зависимости, которые необходимы только для разработки пакета. Это может включать в себя тестовые ролики, компиляторы, упаковщики и т.д. Оба типа зависимостей хранятся в пакете package.json. --save добавляет к dependencies, --save-dev добавляет к devDependencies

npm install документация может быть передана здесь.

Ответ 4

Прекрасным примером этого является:

$ npm install typescript --save-dev

В этом случае вы хотите иметь Typescript (язык кодирования javascript-синтаксического анализа), доступный для разработки, но после развертывания приложения его больше не нужно, так как весь код был переписан JavaScript. Таким образом, нет смысла включать его в опубликованное приложение. В самом деле, это заняло бы только пространство и увеличивало время загрузки.

Ответ 5

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

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

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

Ответ 6

--save-dev сохраняет semver spec в массив "devDependencies" в вашем дескрипторе пакета, --save вместо этого сохраняет его в "зависимостях".

Ответ 7

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

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

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

Ответ 8

Позвольте привести пример,

  • Вы разработчик очень СЕРЬЕЗНОЙ npm библиотеки. Который использует различные библиотеки тестирования для тестирования пакета.
  • Пользователь скачал вашу библиотеку и хочет использовать ее в своем коде. Нужно ли им загружать ваши тестовые библиотеки? Возможно, вы используете jest для тестирования, а они используют mocha. Вы хотите, чтобы они также установили jest? Просто чтобы запустить свою библиотеку?

Без прав? Вот почему они в devDependencies.

Когда кто-то это делает, npm i yourPackage будут установлены только библиотеки, необходимые для запуска вашей библиотеки. Другие библиотеки, которые вы использовали для связывания вашего кода или тестирования и макетов, не будут установлены, потому что вы поместили их в devDependencies. Довольно аккуратно, верно?

Итак, зачем разработчикам нужно показывать devDependancies?

Допустим, ваш пакет является пакетом с открытым исходным кодом, и сотни людей отправляют запросы на получение пакетов в ваш пакет. Тогда как они будут тестировать пакет? Они будут git clone вашего репо, и когда они будут выполнять npm i зависимости, а также devDependencies.
Потому что они не используют ваш пакет. Они продолжают разработку пакета, поэтому, чтобы протестировать ваш пакет, им нужно пройти существующие тестовые случаи, а также написать новый. Поэтому им нужно использовать ваш devDependencies, который содержит все библиотеки тестирования/сборки/проверки, которые вы использовали.

Ответ 9

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

Используйте --save-Dev (или -D) для разделения пакетов, таких как рамки -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"
},

Ответ 10

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

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

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

Ответ 11

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

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

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

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

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

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

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


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

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

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

Резюме:

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

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

Ответ 12

npm install сохраняет все указанные пакеты в зависимости по умолчанию. Кроме того, вы можете контролировать, где и как они сохраняются с помощью некоторых дополнительных флагов:

-P, --save-Prod: Пакет появится в ваших зависимостях. Это значение по умолчанию, если отсутствуют -D или -O.

-D, --save-Dev: Пакет появится в ваших devDependencies.

-O, --save-Optional: Пакет появится в ваших необязательных -O, --save-Optional:.

--no-save: предотвращает сохранение в зависимости.

При использовании любого из вышеперечисленных параметров для сохранения зависимостей в ваш package.json есть два дополнительных необязательных флага:

-E, --save-Exact: Сохраненные зависимости будут настроены с точной версией, а не с использованием оператора диапазона по умолчанию для npms.

-B, --save-Bundle: Сохраненные зависимости также будут добавлены в список bundleDependencies.

Ответ 13

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

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