Яка різниця між --save та --save-dev?


746

Яка різниця між:

npm install [package_name] --save

і:

npm install [package_name] --save-dev

Що це означає?


4
так, я з цим збентежений - якщо ви використовуєте безперервну інтеграцію, як Дженкінс, чи знає Дженкінс використовувати модулі devDependitions для запуску тестів? Я припускаю, але це не надто очевидно.
Олександр Міллс

5
можливо, відредагуйте питання, щоб також сказати, у чому полягає функціональна різниця між залежностями та devDependitions?
Олександр Міллс

5
Пакети, встановлені через опцію --save-dev, не встановлюються повторно, коли користувач виконує npm install --production. Ось операційна різниця (див. Https://docs.npmjs.com/cli/install для отримання додаткової інформації).
Андрій

7
@MuhammadUmer Саме тому люди задають питання тут - аби «зрозуміти». Можливо, додавання реальної відповіді було б більш продуктивним - це, безумовно, цікава відмінність, про яку я не знав.
Simon_Weaver

3
також якщо ви встановите змінну середовища NODE_ENVдля виробництва, то просто npm installавтоматично виключаєте пакети розробки.
Мухаммед Умер

Відповіді:


590
  • --save-devвикористовується для збереження пакета для розробки. Приклад: одиничні тести, мініфікація ..
  • --save використовується для збереження пакету, необхідного для запуску програми.

150
Чим вони відрізняються? Коли я використовую один проти іншого? Чи можу я все-таки використовувати його у виробництві, якщо він знаходиться в режимі --save-dev?
Дейв Войлес

14
Відповідь лаконічно відповідає на ваші перші два запитання. Відповідь на останнє запитання: "Чи можу я все-таки використовувати пакунок у виробництві, якщо він знаходиться в режимі --save-dev?" - "ні". Хоча це, безумовно, можливо , це не призначено.
Технецій

61
Скорочені версії: -Dскорочено --save-devі -Sскорочено--save
chrisco

164
Ця відповідь страшенно розпливчаста. Навіть невеликий приклад міг би пройти довгий шлях, щоб допомогти зробити це більш зрозумілим.
Choylton B. Higginbottom

33
Зауважте, що з npm версії 5.0.0 ця --saveопція більше не потрібна. Якщо ви зробите npm install my-packageце, він додасть "мій пакет" як залежність у файлі package.json.
Мартін Карел

642

Різниця між ними --saveі, --save-devможливо, не відразу помітна, якщо ви спробували їх як у власних проектах. Ось ось кілька прикладів ...

Скажімо, ви створювали додаток, який використовував пакет моменту для розбору та відображення дат. Ваш додаток є планувальником, тому він дійсно потребує запуску цього пакету, як у: не може працювати без нього . У цьому випадку ви б використали

npm install moment --save

Це створило б нове значення у пакеті.json

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

Коли ви розвиваєтесь, це дійсно допомагає використовувати такі інструменти, як тестові набори, і може знадобитися жасминове ядро та карма . У цьому випадку ви б використали

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

Це також створить нове значення у пакеті.json

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

Вам не потрібен тестовий набір, щоб запустити додаток у нормальному стані, тому це --save-devзалежність від типу, нічого більше. Ви можете бачити, як якщо ви не розумієте, що насправді відбувається, це трохи важко уявити.

Взяте безпосередньо з документів NPM, залежно від документа #

Залежності

Залежності задаються у простому об'єкті, який відображає назву пакета в діапазон версій. Діапазон версій - це рядок, що містить один або кілька дескрипторів, розділених пробілом. Залежності також можна визначити за допомогою URL-адреси тарболу чи git.

Будь ласка, не ставте тестові джгути чи транспілятори в об'єкт залежностей. Дивіться devDependitions нижче.

Навіть у документах він пропонує вам використовувати --save-dev для модулів, таких як тестові джгути.

Я сподіваюся, що це допомагає і зрозуміло.


15
IMO, я думаю, що ключове слово "зберегти" - це проблема. Чому вони не складають прапор -dev для розробки та -deploy для розгортання. Це має сенс, ніж ключове слово "зберегти".
Thinh Vu

1
Чому пакунок просто не знає (не вирішує), якщо це пакет випуску чи пакет розробників, і --застосовується для обох. Здається, що інсталюючий користувач вирішив це вирішити, коли розробник пакету створить наміри.
CodeGrue

4
CodeGrue, якщо ви використовуєте jQuery лише для тестування компонентів React, він би входив у save-dev, але ви фактично не можете використовувати його для створення вашого основного проекту. Так, це можливо. То чому б пакувальник знав, що ви з цим робите?
Майкл Брюс

2
Набагато чіткіше. Я вбудований хлопець, який вперше вивчає робочий процес Bootstra + Node.js. Не очевидно, в чому різниця від манжети.
Leroy105

3
@YakovL save-dev означає, що пакети не встановлюються, коли хтось інший встановлює ваш пакунок як свою залежність. Пакети, які використовуються лише для запуску сценаріїв, таких як запуск / збірка, в цьому випадку не знадобляться, тому вони ставлять у залежність від розробників. Якщо ви працюєте над веб-додатком, а не над пакетом для використання іншими, вам, мабуть, не варто переживати про це взагалі.
RIV

111

За замовчуванням 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 install з випуском npm 5 у 2017 році
NattyC

зачекайте, чому складні речення? У DevDependecy розробник може встановити пакети, і він буде оновлений лише devDevependency. Отже, коли новий розробник dependency package name is going to install.клонує кодову базу проекту і запускає npm install => тут лише в node_modules .. не пакет розробника, як у Dev-залежності.
Анупам Маурія

60

Прекрасним прикладом цього є:

$ npm install typescript --save-dev

У цьому випадку ви хочете мати доступний для розробки Typescript (мова кодування, що розбирається на JavaScript), але як тільки програма розгорнута, це вже не потрібно, оскільки весь код був переведений у javascript. Як таке, не було б сенсу включати його у опублікований додаток. Дійсно, це займе лише місце та збільшить час завантаження.


4
Те ж саме стосується: "$ npm install grunt --save-dev", як це корисно для розробки, але не для розгортання.
Jackalope

1
Побічна примітка: Microsoft пропонує встановити пакети @ types / xxx як залежність, а не devDependitions github.com/Microsoft/types-publisher/isissue/81
Дейв

2
Що я вважаю заплутаним, як це навіть має значення? Пакети, збережені за допомогою, --saveяк і раніше зберігаються лише у node_modulesпапці. Код не включений у розгорнутий веб-сайт.
Кокодоко

6
@Kokodoko Коли ви використовуєте --save-devпрапор, пакет додається до вашого devDependenciesоб'єкта. Якщо / коли хтось встановлює ваш пакет, всі dependenciesзавантажуються, але devDependenciesні, оскільки вони не потрібні під час виконання. Як сказано у відповіді, це економить їм час та простір. Розробники, що працюють над самими файлами пакунків, можуть просто запуститись npm installу каталог пакунків, щоб також встановити devDependencies.
Jasjit Singh Marwah

Отже, якщо ви завантажуєте репо з github і вводите npm install, devDependenciesвони ігноруються?
Кокодоко

40

Дозвольте навести приклад,

  • Ви є розробником дуже СЕРЙОЗНИХ НПМ бібліотеки . Яка використовує різні бібліотеки для тестування пакету.
  • Користувач завантажив вашу бібліотеку і хоче використовувати її у своєму коді. Чи потрібно також завантажувати тестуючі бібліотеки? Можливо, ви використовуєте jestдля тестування, і вони використовують mocha. Ви хочете, щоб вони також встановили jest? Просто для запуску вашої бібліотеки?

Ні правда? Тому вони в devDependencies.

Коли хтось зробить, будуть встановлені npm i yourPackageлише ті бібліотеки, які необхідні для запуску вашої бібліотеки. Інші бібліотеки, з якими ви використовували пакет, або тестуєте та знущаєтесь, не буде встановлено, оскільки ви їх розмістили devDependencies. Досить акуратно так?

Отже, чому розробникам потрібно виставляти devDependancies ?

Скажімо, ваш пакет - це пакет із відкритим кодом, і 100 людей надсилають запити на виклик. Тоді як вони перевірять пакет? Вони будуть git cloneваші репо і коли вони будуть робити npm iв залежності , а також devDependencies .
Тому що вони не використовують ваш пакет. Вони розробляють пакет далі, таким чином, для того щоб перевірити ваш пакет, їм потрібно здати існуючі тестові випадки, а також написати нові. Отже, їм потрібно використовувати вашу, devDependenciesяка містить усі бібліотеки для тестування / побудови / знущань, якими ви користувались.


8
Набагато краще, ніж прийнята відповідь, а також відповідь максимум голосів, оскільки ця відповідь має більш практичний характер. Дякую!
Незвичне виключення

Це має бути обрана відповідь. Усі інші відповіді насправді не пояснюють, ЧОМУ ви б використовували один над іншим.
Rocky Kev

34

Як запропонував @ andreas-hultgren у цій відповіді та згідно з документами npm :

Якщо хтось планує завантажити та використовувати ваш модуль у своїй програмі, він, ймовірно, не хоче або потребує завантаження та створення зовнішнього тесту чи документації, який ви використовуєте.

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


3
Зауважте, що у мене виникли проблеми під час використання gulp та встановлення пакетів, --save-devде пакет не встановив необхідні залежності. Запуск --saveвстановлених тих відсутніх залежностей.
Нік М

18
Я також хотів би зазначити, що зараз я використовую --saveдля всіх, крім тестових та документаційних залежностей (згідно з документами npm). Я починаю думку, що приклад Йеомана, про який я згадував вище, не є гарним прикладом найкращої практики.
wayfarer_boy

Я теж думаю, чому б вам коли-небудь знадобилося --save-dev, тільки стає менш зрозумілим з кожною відповіддю тут :)
Кокодоко

20

--save-devзберігає параметри semver у масиві "devDependitions" у файлі дескриптора пакунків, --saveа замість цього - у "залежності".


83
і яка функціональна різниця?
ahnbizcad

6
ця відповідь має для мене найбільш сенс, тоді для розвитку потрібні devDependpendi, але не виробництво, тому htmllint, компіляція sass тощо та Dependpendi - це виробничі вимоги, такі як Diaporama, які повинні бути присутніми для роботи.
мельник горили

3
@ahnbizcad Він відповів краще тут , але основна функціональна різниця в тому , що devDependencies не транзитивній включені.
Темп

Хіба це не самий інтуїтивний спосіб описати це для того, хто ще не знає, це ?: Dev --save-devробить пакети локальними для вашого проекту, тоді як --saveробить їх локальними для вашої установки вузла?
ahnbizcad

9

Чіткі відповіді вже надані. Але варто згадати, як devDependenciesвпливає встановлення пакетів:

За замовчуванням npm install встановить усі модулі, перелічені як залежності в package.json. З прапором --production (або коли змінна середовища NODE_ENV встановлена ​​у виробництві), npm не буде встановлювати модулі, перелічені у devDependitions.

Дивіться: https://docs.npmjs.com/cli/install


8

Ви, як правило, не хочете роздувати виробничий пакет речами, які ви тільки маєте намір використовувати для цілей розвитку.

Використовуйте --save-dev(або -D) опцію для розділення пакетів, таких як Frame Test Framework (жари, жасмин, мокка, чай тощо)

Будь-які інші пакети, необхідні вашій програмі для виробництва, повинні бути встановлені за допомогою --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"
},

5

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

Приклад: експрес, body-parser, lodash, шолом, mysql все це використовується під час роботи програми - за винятком встановлення залежностей, тоді як моча, istanbul, chai, sonarqube-сканер усі використовуються під час розробки, тому покладіть їх у dev -залежності .

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


3

Усі пояснення тут чудові, але бракує дуже важливої ​​речі: як ви встановлюєте лише виробничі залежності? (без залежностей від розвитку). Ми відокремлюємось dependenciesвід devDependencies, використовуючи --saveабо --save-dev. Щоб встановити все, що ми використовуємо:

npm i

Для встановлення лише виробничих пакетів ми повинні використовувати:

npm i --only=production

0

Я хочу додати деякі свої ідеї як

Я думаю, що всі різниці з’являться, коли хтось використовуватиме ваші коди замість того, щоб використовувати їх самостійно

Наприклад, ви пишете бібліотеку HTTP під назвою node's request

У вашій бібліотеці

ви використовували lodash для обробки рядків та об'єктів, без lodash ваші коди не можуть працювати

Якщо хтось використовує вашу бібліотеку HTTP як частину його кодів. Ваші коди будуть складені з його.

ваші коди потрібні лодаш, тому вам потрібно поставити їх 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 (або подібне) для створення файлів збирання для розміщення на вашому сервері, це насправді не має значення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.