Jaka jest różnica między --save a --save-dev?

746

Jaka jest różnica pomiędzy:

npm install [package_name] --save

i:

npm install [package_name] --save-dev

Co to znaczy?

Nfort
źródło
4
tak, jestem zdezorientowany - jeśli używasz ciągłej integracji, takiej jak Jenkins, czy Jenkins wie, że używa modułów devDependencies do uruchamiania testów? Zakładam, że tak, ale to nie jest zbyt oczywiste.
Alexander Mills,
5
być może zredaguj pytanie, aby również powiedzieć, jaka jest funkcjonalna różnica między zależnościami i zależnościami dev?
Alexander Mills,
5
Pakiety zainstalowane za pomocą opcji --save-dev nie są ponownie instalowane podczas wykonywania przez użytkownika npm install --production. Na tym polega różnica operacyjna ( więcej informacji na stronie: https://docs.npmjs.com/cli/install ).
Andrew
7
@MuhammadUmer Właśnie dlatego ludzie zadają tutaj pytania - w celu „uzyskania wskazówki”. Być może dodanie prawdziwej odpowiedzi byłoby bardziej produktywne - to zdecydowanie interesujące rozróżnienie, o którym nie wiedziałem.
Simon_Weaver
3
także jeśli ustawisz zmienną środowiskową NODE_ENVna produkcyjną, to po prostu npm installautomatycznie wyklucza pakiety programistyczne.
Muhammad Umer

Odpowiedzi:

590
  • --save-devsłuży do zapisania pakietu do celów programistycznych. Przykład: testy jednostkowe, minimalizacja ..
  • --save służy do zapisania pakietu wymaganego do uruchomienia aplikacji.
Tuong Le
źródło
150
Czym się różnią? Kiedy miałbym używać jednego kontra drugiego? Czy nadal mogę używać tego pakietu w produkcji, jeśli jest poniżej --save-dev?
Dave Voyles,
14
Odpowiedź zwięźle odpowiada na dwa pierwsze pytania. Odpowiedź na ostatnie pytanie: „Czy nadal mogę używać pakietu w produkcji, jeśli jest on poniżej - save-dev”, brzmi „nie”. Chociaż jest to oczywiście możliwe , nie jest to zamierzone.
Technetium
61
Wersje skrócone: -Djest skrótem --save-devi -Sjest skrótem--save
chrisco
164
Ta odpowiedź jest frustrująco niejasna. Nawet mały przykład znacznie ułatwiłby wyjaśnienie tego.
Choylton B. Higginbottom
33
Zauważ, że od wersji npm 5.0.0 --saveopcja nie jest już potrzebna. Jeśli to zrobisz npm install my-package, doda „my-package” jako zależność w pliku package.json.
Martin Carel
642

Różnica między --savei --save-devmoże nie być natychmiast zauważalna, jeśli wypróbowałeś je oba przy swoich własnych projektach. Oto kilka przykładów ...

Powiedzmy, że tworzysz aplikację, która używała pakietu moment do analizowania i wyświetlania dat. Twoja aplikacja jest programem planującym, więc naprawdę potrzebuje tego pakietu do uruchomienia, ponieważ w: nie można bez niego uruchomić . W takim przypadku skorzystasz

npm install moment --save

Spowoduje to utworzenie nowej wartości w pliku package.json

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

Kiedy się rozwijasz, naprawdę pomaga korzystanie z narzędzi, takich jak zestawy testowe, i może wymagać rdzenia jaśminu i karmy . W takim przypadku skorzystasz

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

Spowoduje to również utworzenie nowej wartości w pliku package.json

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

Nie potrzebujesz zestawu testów do uruchomienia aplikacji w jej normalnym stanie, więc jest to --save-devzależność od typu, nic więcej. Możesz zobaczyć, jak jeśli nie rozumiesz, co się naprawdę dzieje, trudno to sobie wyobrazić.

Zaczerpnięte bezpośrednio z NPM docs docs # zależności

Zależności

Zależności są określone w prostym obiekcie, który odwzorowuje nazwę pakietu na zakres wersji. Zakres wersji to ciąg znaków, który ma jeden lub więcej deskryptorów oddzielonych spacjami. Zależności można również zidentyfikować za pomocą tarballa lub adresu URL git.

Proszę nie umieszczać testowych wiązek lub transpilatorów w obiekcie zależności. Zobacz devDependencies poniżej.

Nawet w dokumentacji prosi o użycie --save-dev dla modułów takich jak uprzęże testowe.

Mam nadzieję, że to pomaga i jest jasne.

Michael Bruce
źródło
15
IMO, myślę, że słowo kluczowe „zapisz” jest problemem. Dlaczego nie robią flagi -dev dla rozwijania i -deploy dla wdrażania. Ma to sens niż słowo kluczowe „zapisz”.
Thinh Vu,
1
Dlaczego pakiet po prostu nie wie (decyduje), czy jest to pakiet wydany czy pakiet deweloperski i --save może być używany do obu. Dziwne wydaje się, aby instalujący użytkownik zdecydował o tym, gdy twórca pakietu utworzy zamiar.
CodeGrue
4
CodeGrue, jeśli używasz jQuery tylko do testowania komponentów React, to pójdzie w save-dev, ale nie możesz go użyć do zbudowania głównego projektu. Tak, jest to możliwe. Dlaczego więc pakujący miałby wiedzieć, co z tym robisz?
Michael Bruce
2
O wiele jaśniej. Jestem osadzonym facetem, który po raz pierwszy uczy się przepływu pracy Bootstra + Node.js. Nie jest oczywiste, jaka jest różnica między mankietem.
Leroy105
3
@YakovL save-dev oznacza, że ​​pakiety nie są instalowane, gdy ktoś inny zainstaluje twój pakiet jako jego zależność. W takim przypadku pakiety, które są używane tylko do uruchamiania skryptów, takich jak start / build, nie będą potrzebne, więc są one zależne od deweloperów. Jeśli pracujesz nad aplikacją internetową, a nie nad pakietem do użytku przez innych, prawdopodobnie nie powinieneś się tym martwić.
riv
111

Domyślnie NPM po prostu instaluje pakiet w module node_modules. Kiedy próbujesz zainstalować zależności dla swojej aplikacji / modułu, musisz je najpierw zainstalować, a następnie dodać do dependenciessekcji swojego package.json.

--save-devdodaje pakiet innej firmy do zależności programistycznych pakietu. Nie zostanie zainstalowany, gdy ktoś zainstaluje twój pakiet. Zwykle jest instalowany tylko wtedy, gdy ktoś sklonuje twoje repozytorium źródłowe i uruchomi się npm installw nim.

--savedodaje pakiet innej firmy do zależności pakietu. Będzie instalowany wraz z pakietem za każdym razem, gdy ktoś uruchomi npm install package.

Zależności deweloperów to te zależności, które są potrzebne tylko do opracowania pakietu. Może to obejmować testery, kompilatory, programy pakujące itp. Oba typy zależności są przechowywane w package.jsonpliku pakietu . --savedodaje do dependencies, --save-devdodaje dodevDependencies

Dokumentacja instalacji npm można znaleźć tutaj.

Lakshmi Swetha G.
źródło
37
Podejrzewałem, że ... możesz używać --save-dev i --save zamiennie, jeśli tworzysz aplikację internetową, która nie stanie się pakietem, tj. Pobrana z npm, jeśli tworzysz pakiet do udostępniania innym, to ważne jest, aby zrozumieć różnicę.
VFein
13
W końcu dziękuję komuś, kto mówi o swoim celu, gdy używasz instalacji npm
CapturedTree
3
--save jest teraz domyślnie instalowany z npm z wydaniem npm 5 w 2017 r.
NattyC
czekaj, dlaczego złożone zdania? W DevDependecy deweloper może instalować pakiety i będzie aktualizowany tylko devDevependency. Więc kiedy nowy programista sklonuje dependency package name is going to install.bazę kodu projektu i uruchom npm install => tutaj tylko w module node_moduły .. nie pakiet dewelopera jak w zależności od Dev.
Anupam Maurya
60

Doskonałym tego przykładem jest:

$ npm install typescript --save-dev

W takim przypadku chciałbyś mieć Typescript (język kodowania analizowany przez javascript) do opracowania, ale po wdrożeniu aplikacji nie jest już konieczne, ponieważ cały kod został przeniesiony do javascript. W związku z tym nie ma sensu umieszczać go w opublikowanej aplikacji. Rzeczywiście, zajmie to tylko miejsce i wydłuży czas pobierania.

Szakal
źródło
4
To samo dotyczy: „$ npm install grunt --save-dev”, ponieważ jest użyteczny przy programowaniu, ale nie przy wdrażaniu.
Jackalope
1
Dodatkowa uwaga: Microsoft sugeruje instalowanie pakietów @ types / xxx jako zależności, a nie devDependencies github.com/Microsoft/types-publisher/issues/81
Dave
2
Moim zdaniem jest to mylące, jak to w ogóle ma znaczenie? Pakiety zapisane przy użyciu --savesą nadal zapisywane tylko w node_modulesfolderze. Kod nie jest zawarty we wdrożonej witrynie.
Kokodoko,
6
@Kokodoko Gdy używasz --save-devflagi, pakiet jest dodawany do twojego devDependenciesobiektu. Jeśli / kiedy ktoś zainstaluje twój pakiet, wszystkie dependenciessą pobierane, ale devDependenciesnie są, ponieważ nie są wymagane w czasie wykonywania. Jak stwierdzono w odpowiedzi, oszczędza to czas i przestrzeń. Programiści pracujący na samych plikach pakietu mogą po prostu uruchomić npm installkatalog katalogu pakietu, aby również go zainstalować devDependencies.
Jasjit Singh Marwah
Więc jeśli pobierzesz repo z github i napiszesz npm install , devDependenciessą one ignorowane?
Kokodoko
40

Dam ci przykład,

  • Jesteś programistą bardzo POWAŻNE npm biblioteki . Który używa różnych bibliotek testowych do testowania pakietu.
  • Użytkownik pobrał bibliotekę i chce użyć jej w swoim kodzie. Czy muszą również pobrać biblioteki testowe? Może używasz jestdo testowania, a oni używają mocha. Czy chcesz je również zainstalować jest? Wystarczy Aby uruchomić bibliotekę?

Bez prawa? Właśnie dlatego są w środku devDependencies.

Gdy ktoś to zrobi, zostaną zainstalowane npm i yourPackagetylko biblioteki wymagane do URUCHOMIENIA biblioteki. Inne biblioteki, z których korzystałeś w pakiecie ze swoim kodem, testowania i kpowania, nie zostaną zainstalowane, ponieważ je umieścisz devDependencies. Całkiem nieźle, prawda?

Więc dlaczego nie deweloperzy muszą wystawiać devDependancies ?

Załóżmy, że Twój pakiet jest pakietem typu open source, a setki osób wysyłają do niego żądania ściągania. Jak przetestują paczkę? Będą one git cloneswoje repo i kiedy oni zrobić npm iz zależnościami , jak również devDependencies .
Ponieważ nie używają twojego pakietu. Rozwijają pakiet dalej, dlatego aby przetestować pakiet, muszą przekazać istniejące przypadki testowe, a także napisać nowe. Muszą więc użyć Twojej, devDependenciesktóra zawiera wszystkie biblioteki testujące / budujące / kpiące, których używałeś.

Aritra Chakraborty
źródło
8
Znacznie lepsza niż odpowiedź zaakceptowana, a także odpowiedź z maksymalną liczbą głosów, ponieważ odpowiedź ta ma bardziej praktyczny charakter. Dzięki!
Uncaught Exception
To powinna być wybrana odpowiedź. Wszystkie pozostałe odpowiedzi tak naprawdę nie wyjaśniają, DLACZEGO użyłbyś jednej nad drugą.
Rocky Kev
34

Jak sugeruje @ andreas-hultgren w tej odpowiedzi i zgodnie z dokumentami npm :

Jeśli ktoś planuje pobrać moduł i używać go w swoim programie, prawdopodobnie nie chce lub nie musi pobierać i nie budować używanego zewnętrznego testu lub struktury dokumentacji.

Jednak w przypadku tworzenia aplikacji webowych Yeoman (narzędzie do rusztowania, które instaluje między innymi sprawdzony, wstępnie napisany plik package.json) umieszcza wszystkie pakiety w devDependencies i nic w zależnościach, więc wydaje się, że użycie --save-devjest bezpiecznym wyborem w webapp rozwoju, przynajmniej.

wayfarer_boy
źródło
3
Zauważ, że napotkałem problemy podczas używania gulp i instalowania pakietów, w --save-devktórych pakiet nie instalowałby wymaganych zależności. Uruchomiono --savezainstalowane brakujące zależności.
Nick M
18
Chciałbym również zauważyć, że teraz używam --savedo wszystkich zależności oprócz testów i dokumentacji (zgodnie z dokumentacją npm). Zaczynam myśleć, że wspomniany powyżej przykład Yeomana nie jest dobrym przykładem najlepszych praktyk.
wayfarer_boy
Też tak myślę, dlaczego kiedykolwiek miałbyś potrzebować, --save-devstaje się coraz mniej jasne z każdą odpowiedzią tutaj :)
Kokodoko
20

--save-devzapisuje specyfikację semver w tablicy „devDependencies” w pliku deskryptora pakietu, --savezamiast tego zapisuje ją w „zależności”.

alex
źródło
83
a jaka jest różnica funkcjonalna?
ahnbizcad
6
ta odpowiedź jest dla mnie najbardziej sensowna, devDependencies są wtedy wymagane do rozwoju, ale nie do produkcji, więc htmllint, kompilacja sass itp. i Zależności dotyczą wymagań produkcyjnych, takich jak Diaporama, które będą musiały być obecne, aby wszystko działało.
młynarza goryla
3
@ahnbizcad Odpowiedź jest tutaj lepsza , ale podstawową różnicą funkcjonalną jest to, że devDependencies nie są uwzględniane w sposób tranzytowy.
Tempo
Czy nie jest to najbardziej intuicyjny sposób na opisanie tego komuś, kto jeszcze tego nie wie ?: Dev --save-devczyni pakiety lokalnymi dla twojego projektu, a jednocześnie --saveczyni je lokalnymi dla twojej instalacji węzła?
ahnbizcad
9

Jasne odpowiedzi są już dostarczone. Warto jednak wspomnieć o wpływie devDependenciesna instalowanie pakietów:

Domyślnie, npm install zainstaluje wszystkie moduły wymienione jako zależności w package.json. Z flagą --production (lub gdy zmienna środowiskowa NODE_ENV jest ustawiona na produkcyjną), npm nie będzie instalował modułów wymienionych w devDependencies.

Zobacz: https://docs.npmjs.com/cli/install

Alireza
źródło
8

Zasadniczo nie chcesz nadmuchać pakietu produkcyjnego rzeczami, których zamierzasz używać tylko do celów programistycznych.

Użyj --save-dev(lub-D ), aby oddzielić pakiety, takie jak frameworki testów jednostkowych (jest, jaśmin, mokka, chai itp.)

Wszelkie inne pakiety potrzebne aplikacji do produkcji powinny być instalowane przy użyciu --save(lub -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

Jeśli otworzysz package.jsonplik, zobaczysz te wpisy w dwóch różnych sekcjach:

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

"devDependencies": {
    "jest": "22.x",
    "typescript": "^2.8.3"
},
velhala
źródło
5

--save-dev służy do modułów wykorzystywanych przy tworzeniu aplikacji, nie wymaga podczas uruchamiania go w środowisku produkcyjnym - save służy do dodawania go w package.json i jest wymagany do uruchomienia aplikacji.

Przykład: express, body-parser, lodash, kask, mysql wszystkie te są używane podczas uruchamiania aplikacji - zapisz, aby wprowadzić zależności, podczas gdy mocha, istanbul, chai, sonarqube-skaner są używane podczas programowania, więc włóż te w dev -zależności.

Łącze npm lub instalacja npm zainstaluje również moduły zależności programistów wraz z modułami zależności w folderze projektu

Biswadew
źródło
3

Wszystkie wyjaśnienia tutaj są świetne, ale brakuje im bardzo ważnej rzeczy: jak zainstalować tylko zależności produkcyjne? (bez zależności programistycznych). Oddzielamy dependenciesod devDependenciesużywając --savelub --save-dev. Aby zainstalować wszystko, czego używamy:

npm i

Aby zainstalować tylko pakiety produkcyjne, powinniśmy użyć:

npm i --only=production
Ronny Sherer
źródło
0

Chcę dodać kilka moich pomysłów jako

Myślę, że wszystkie inne pojawią się, gdy ktoś użyje twoich kodów zamiast z nich korzystać

Na przykład piszesz bibliotekę HTTP o nazwie node's request

W twojej bibliotece

użyłeś lodash do obsługi ciągu i obiektu, bez lodash twoje kody nie mogą działać

Jeśli ktoś użyje twojej biblioteki HTTP jako części swoich kodów. Twoje kody zostaną skompilowane z jego.

kody muszą lodash, więc potrzebują włożysz dependenciesdo kompilacji


Jeśli napiszesz podobny projekt monaco-editor , który jest edytorem internetowym,

masz pakiet wszystkich kodów, a product env libraryprzy użyciu webpacka po zakończeniu kompilacji masz tylkomonaco-min.js

Więc ktoś nie zastanawia się , czy --savelub --save-dependenciestylko on tego potrzebujemonaco-min.js

Podsumowanie:

  1. Jeśli ktoś chce skompilować twoje kody (użyj jako bibliotekę), umieść w lodashktórych używane są twoje kodydependencies

  2. Jeśli ktoś chce dodać więcej funkcji do kodów, potrzebuje unit testi compilerwłóż jedev-dependencies

toffi
źródło
0

Ludzie używają npm do produkcji do robienia niesamowitych, fajnych rzeczy, Node.js jest tego przykładem, więc nie chcesz, aby wszystkie twoje narzędzia programistyczne były uruchomione.

Jeśli używasz gulp (lub podobnego) do tworzenia plików kompilacji do umieszczenia na serwerze, to tak naprawdę nie ma znaczenia.

Tristanisginger
źródło