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.
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
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ć.
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.
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
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.
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ś.
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ą.
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.
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”.
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.
--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
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ć:
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.
npm install --production
. Na tym polega różnica operacyjna ( więcej informacji na stronie: https://docs.npmjs.com/cli/install ).NODE_ENV
na produkcyjną, to po prostunpm install
automatycznie wyklucza pakiety programistyczne.Odpowiedzi:
--save-dev
sł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.źródło
-D
jest skrótem--save-dev
i-S
jest skrótem--save
--save
opcja nie jest już potrzebna. Jeśli to zrobisznpm install my-package
, doda „my-package” jako zależność w pliku package.json.Różnica między
--save
i--save-dev
moż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
Spowoduje to utworzenie nowej wartości w pliku package.json
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
Spowoduje to również utworzenie nowej wartości w pliku package.json
Nie potrzebujesz zestawu testów do uruchomienia aplikacji w jej normalnym stanie, więc jest to
--save-dev
zależ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
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.
źródło
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
dependencies
sekcji swojegopackage.json
.--save-dev
dodaje 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 install
w nim.--save
dodaje pakiet innej firmy do zależności pakietu. Będzie instalowany wraz z pakietem za każdym razem, gdy ktoś uruchominpm 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.json
pliku pakietu .--save
dodaje dodependencies
,--save-dev
dodaje dodevDependencies
Dokumentacja instalacji npm można znaleźć tutaj.
źródło
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.Doskonałym tego przykładem jest:
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.
źródło
--save
są nadal zapisywane tylko wnode_modules
folderze. Kod nie jest zawarty we wdrożonej witrynie.--save-dev
flagi, pakiet jest dodawany do twojegodevDependencies
obiektu. Jeśli / kiedy ktoś zainstaluje twój pakiet, wszystkiedependencies
są pobierane, aledevDependencies
nie 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 install
katalog katalogu pakietu, aby również go zainstalowaćdevDependencies
.npm install
,devDependencies
są one ignorowane?Dam ci przykład,
jest
do 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 yourPackage
tylko 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ściszdevDependencies
. 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 clone
swoje repo i kiedy oni zrobićnpm i
z 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,
devDependencies
która zawiera wszystkie biblioteki testujące / budujące / kpiące, których używałeś.źródło
Jak sugeruje @ andreas-hultgren w tej odpowiedzi i zgodnie z dokumentami npm :
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-dev
jest bezpiecznym wyborem w webapp rozwoju, przynajmniej.źródło
--save-dev
których pakiet nie instalowałby wymaganych zależności. Uruchomiono--save
zainstalowane brakujące zależności.--save
do 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.--save-dev
staje się coraz mniej jasne z każdą odpowiedzią tutaj :)--save-dev
zapisuje specyfikację semver w tablicy „devDependencies” w pliku deskryptora pakietu,--save
zamiast tego zapisuje ją w „zależności”.źródło
--save-dev
czyni pakiety lokalnymi dla twojego projektu, a jednocześnie--save
czyni je lokalnymi dla twojej instalacji węzła?Jasne odpowiedzi są już dostarczone. Warto jednak wspomnieć o wpływie
devDependencies
na instalowanie pakietów:Zobacz: https://docs.npmjs.com/cli/install
źródło
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
).Jeśli otworzysz
package.json
plik, zobaczysz te wpisy w dwóch różnych sekcjach:źródło
--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
źródło
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
dependencies
oddevDependencies
używając--save
lub--save-dev
. Aby zainstalować wszystko, czego używamy:Aby zainstalować tylko pakiety produkcyjne, powinniśmy użyć:
źródło
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
dependencies
do kompilacjiJeśli napiszesz podobny projekt
monaco-editor
, który jest edytorem internetowym,masz pakiet wszystkich kodów, a
product env library
przy użyciu webpacka po zakończeniu kompilacji masz tylkomonaco-min.js
Więc ktoś nie zastanawia się , czy
--save
lub--save-dependencies
tylko on tego potrzebujemonaco-min.js
Podsumowanie:
Jeśli ktoś chce skompilować twoje kody (użyj jako bibliotekę), umieść w
lodash
których używane są twoje kodydependencies
Jeśli ktoś chce dodać więcej funkcji do kodów, potrzebuje
unit test
icompiler
włóż jedev-dependencies
źródło
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.
źródło