Jak zapobiec instalacji modułów NPM „devDependencies” dla Node.js (package.json)?


587

Mam to w moim pliku package.json (wersja skrócona):

{
  "name": "a-module",
  "version": "0.0.1",
  "dependencies": {
    "coffee-script":      ">= 1.1.3"
  },
  "devDependencies": {
    "stylus":             ">= 0.17.0"
  }
}

Używam NPM w wersji 1.1.1 na Mac 10.6.8.

Kiedy uruchomić następujące polecenie z katalogu głównego projektu, instaluje zarówno dependencies a devDependencies :

npm install

Miałem wrażenie, że to polecenie zainstalowało devDependencies:

npm install --dev

Jak mam to zrobić, aby npm installinstalowało się tylko dependencies(aby środowisko produkcyjne pobierało tylko te moduły), podczas gdy coś takiego npm install --devinstaluje oba dependenciesi devDependencies?


1
Zgodnie z dokumentem, masz rację, --dev instaluje devdeps, w przeciwnym razie tylko deps. npmjs.org/doc/json.html . Wiem, że to działa przynajmniej dla nazwanych pakietów.
mna

1
jeśli natkniesz się na to pytanie w 2015 roku, przełącznik --save-dev wykonuje lewę dokładnie tak, jak zadano w tym pytaniu.
Anand

1
Ta odpowiedź stackoverflow.com/a/22004559/3718119 daje ładny wyjaśnienia różnic dependenciesi devDependencieskiedy każdy z nich jest używany.
quasoft,

Odpowiedzi:


844

npm installPolecenie zainstaluje devDependenciespo drugiej dependencies, gdy prowadzony wewnątrz katalogu pakietu w środowisku programistycznym (domyślnie).

Użyj npm install --only=prod(lub --only=production), aby zainstalować tylko dependencies , a nie devDependencies,niezależnie od wartości NODE_ENVzmiennej środowiskowej.

Źródło: npm docs

Uwaga: przed wersją 3.3.0 programu npm (13.08.2015) została wywołana opcja --production, tj npm install --production.


2
Argumentacja Agate polega prawdopodobnie na usunięciu devDependencies, aby konsumenci instalujący pakiet npm install yourpackage.tgznie otrzymywali również devDependencies. Tak jednak już jest. Zobacz odpowiedź Kevina Coxa poniżej ( stackoverflow.com/a/15826602/825588 ).
Johann

5
npmjs.org/doc/cli/npm-install.html „Domyślnie, npm install zainstaluje wszystkie moduły wymienione jako zależności. Z flagą --production, npm nie zainstaluje modułów wymienionych w devDependencies.”
tomByrer

14
O mój Boże. Całkowicie miałem NODE_ENV=productionz czegoś innego, co robiłem i nie mogłem się zorientować w życiu, dlaczego npm installnie instalowałbym zależności. Dzięki za dokładną odpowiedź.
aendrew

1
npm install --dev instalowałby tylko zależności
deweloperów

10
Dla npm 3.3 i nowszych: npm WARN install Zastosowanie --devopcji jest przestarzałe. Użyj --only=devzamiast tego.
srcspider,

232

Też wpadam na ten problem! instalacja npm jest nieco myląca, a posty internetowe wciąż wprowadzają flagi -d / - dev, jakby istniał jawny tryb instalacji „programistyczny”.

  • npm installzainstaluje zarówno „ zależności ”, jak i „ devDependencies

  • npm install --productionzainstaluje tylko „ zależności

  • npm install --devzainstaluje tylko „ devDependencies


29
OSTRZEŻENIE: Jeśli NODE_ENVjest ustawiony na productioni uruchomisz npm install, nie zainstaluje zależności programistycznych. W moim pliku Docker spotkałem się z tym problemem.
vaughan

1
@vaughan Też natknąłem się na to, można rozwiązać przez uruchomienie npm --production=false install(choć nie jestem pewien, czy to zadziała obok flagi --dev)
Bavell

138

Nowa opcja to:

npm install --only=prod

Jeśli chcesz zainstalować tylko devDependencies:

npm install --only=dev

1
To odpowiada odwrotności pytania. OP pyta, jak NIE instalować devDependencies.
musicin3d

2
jesteś częściowo poprawny @ musicin3d, dlatego w pierwszej części odpowiedziałem, jak zainstalować zależności tylko prod, a w drugiej części, jak zainstalować zależności tylko dla programistów, na wszelki wypadek.
Cloxure,

5
No hej. Zostawiłem ten komentarz, zanim @ user1614572 dodał część o --only=prod. Pan ma częściową rację. ; P
musicin3d

czy możemy uwzględnić osobną zależność dla wdrożenia?
Jeeva Jsb

1
To komentarz, a nie odpowiedź. Nie sprawdzam okresowo wszystkich moich komentarzy. Nigdy nie widziałem, żeby ludzie aktualizowali komentarze sprzed lat. Zasadniczo przyszedłeś tutaj, aby skrytykować to, że poświęciłem rok na mój komentarz. Nie będę więcej odpowiadał. Baw się trollując innych ludzi.
Jacques ジ ャ ッ ク


33

Jeśli już zainstalowałeś wszystkie swoje zależności i chcesz uniknąć konieczności ponownego pobierania pakietów produkcyjnych z NPM, możesz po prostu wpisać:

npm prune --production

Spowoduje to usunięcie zależności deweloperów z node_modulesfolderu, co jest przydatne, jeśli próbujesz zautomatyzować proces dwuetapowy

  1. Webpackuj mój projekt, używając zależności programistycznych
  2. Zbuduj obraz Dockera przy użyciu tylko modułów produkcyjnych

Bieganie npm prunepomiędzy nimi pozwoli Ci uniknąć konieczności ponownej instalacji wszystkiego!


19

Podczas korzystania z „instalacji npm” moduły są ładowane i dostępne w całej aplikacji, niezależnie od tego, czy są to „devDependencies” czy „dependencies”. Suma tego pomysłu: wszystko, co pakiet.json definiuje jako zależność (dowolnego typu), instaluje się w module node_modules.

Różnica między zależnościami / devDependencies / opcjonalnymiDependencies polega na tym, co konsumenci twojego kodu mogą zrobić z npm, aby zainstalować te zasoby.

Zgodnie z dokumentacją: https://npmjs.org/doc/json.html ...

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.

W takim przypadku najlepiej wymienić te dodatkowe elementy w skrócie devDependencies.

Te rzeczy będą instalowane za każdym razem, gdy zostanie ustawiona flaga konfiguracji --dev. Ta flaga jest ustawiana automatycznie podczas wykonywania linku npm lub instalowania npm z katalogu głównego pakietu i może być zarządzana jak każdy inny parametr konfiguracji npm. Zobacz config (1), aby uzyskać więcej informacji na ten temat.

Aby rozwiązać to pytanie, jeśli chcesz zainstalować TYLKO „zależności” przy użyciu npm, następujące polecenie to:

npm install --production

Można to potwierdzić, sprawdzając zatwierdzenie Git, które dodało ten filtr (wraz z kilkoma innymi filtrami [wymienionymi poniżej], aby zapewnić tę funkcjonalność).

Alternatywne filtry, które mogą być używane przez npm:

--save          => updates dependencies entries in the {{{json}}} file
--force         => force fetching remote entries if they exist on disk 
--force-latest  => force latest version on conflict
--production    => do NOT install project devDependencies
--no-color      => do not print colors

@dmarr spróbuj użyć npm install --production


16

npm zainstaluje zależności dev podczas instalacji z pakietu (jeśli jest package.jsonw bieżącym katalogu). Jeśli pochodzi z innej lokalizacji (rejestr npm, git repo, inna lokalizacja w systemie plików), instaluje tylko zależności.


Czy mógłbyś przeformułować? Myślę, że popełniłeś błąd w nawiasie, myślę, że zapomniałeś go wcześniej zamknąć, a twoja frase nie ma dla mnie większego sensu (nie mówiący po angielsku). Komentarz Johanna pod odpowiedzią Rohana Singha skierował mnie do spojrzenia na twoją odpowiedź (ponieważ moje wątpliwości były dokładnie takie same jak wątpliwości agata) i bez powodzenia. Nadal nie rozumiem, jak npm install some-modulenie będzie instalować zależności deweloperów some-module.
Rafael Eyng

Dzięki, naprawione. Jednak nie rozumiem reszty twojego pytania.
Kevin Cox

3

Przekonałem się, że podczas próby zainstalowania zależności deweloperskich dla pakietu zawierającego dodatek do węzła nie można uniknąć budowania dodatku podczas uruchamiania npm install --dev, nawet jeśli po prostu chcesz zainstalować devDependencies. Musiałem więc ominąć npm plecy:

node -e 'console.log( Object.keys( require( "./package.json" ).devDependencies ) );' | \
sed  -e "s/^[^']*'//" -e "s/'.*$//" | \
xargs npm install

Albo jeszcze lepiej (i bardziej zwięźle),

node -e 'Object.keys( require( "./package.json" ).devDependencies )
.map( function( item ){ console.log( item ) } );' | xargs npm install

3

Użyj npm install packageName --savetego doda pakiet w zależnościach , jeśli użyjesz npm install packageName --save-devto devDependencies .

npm install packageName --save-devpowinien być używany do dodawania pakietów do celów programistycznych. Jak dodanie pakietów TDD (Chai, mokka itp.). Które są wykorzystywane w rozwoju, a nie w produkcji.


OP nie ma problemu z zapisywaniem zależności, package.jsonale gdy te zależności zostaną już zapisane , to jak wymusić npmzainstalowanie tylko jednego określonego rodzaju zależności. Kiedy przeczytałem twoją odpowiedź tutaj, nie nauczyłem się niczego, co pomogłoby rozwiązać problem postawiony przez PO.
Louis,

3

Warto wspomnieć, że można użyć NODE_ENVzmiennej środowiskowej, aby osiągnąć ten sam wynik. Szczególnie przydatne, jeśli konteneryzujesz aplikację Node (np. Docker).

NODE_ENV=production npm install

Powyższy kod zainstaluje wszystkie twoje zależności oprócz tych programistycznych (tj devDependencies.).

jeśli potrzebujesz użyć zmiennych środowiskowych w swojej Dockerfilewięcej informacji można znaleźć tutaj .

Zmienne środowiskowe można łatwo zastąpić w razie potrzeby (np. Jeśli chcesz uruchomić zestaw testowy, powiedz na Travis CI). Gdyby tak było, możesz zrobić coś takiego:

docker run -v $(pwd):/usr/src/app --rm -it -e NODE_ENV=production node:8 npm install

Dokumentacja NPM tutaj

produkcja

  • Domyślnie: false
  • Typ: Boolean Ustaw na true, aby działać w trybie „produkcyjnym”.

    1. devDependencies nie są instalowane na najwyższym poziomie podczas uruchamiania lokalnej instalacji npm bez żadnych argumentów.
    2. Ustaw NODE_ENV = „production” dla skryptów cyklu życia.

Szczęśliwa konteneryzacja =)


3

Proponuję użyć npm ci. Jeśli chcesz zainstalować tylko pakiety potrzebne do produkcji (jak napisałeś - bez devDependencies), to:

npm ci --only=production

lub

NODE_ENV=production npm ci

Jeśli wolisz oldschool, npm installto:

npm install --production

lub

NODE_ENV=production npm install

Oto dobra odpowiedź, dlaczego powinieneś używać npm ci.


Fajnie, działa npm cirównież nie tylko npm install!
Klesun

2

Musisz dodać do wybranej odpowiedzi: na razie npm installw katalogu pakietu (zawierającym package.json) zainstaluje devDependencies, npm install -gale ich nie zainstaluje.


7
Tak, -gnie instaluje się devDependencies, ale instaluje pakiety globalnie, co często nie jest zamierzonym rezultatem.
Bardi Harborow

0

npm install --productionto właściwy sposób instalowania modułów węzłów wymaganych do produkcji. Sprawdź dokumentację, aby uzyskać więcej informacji


-1

Teraz jest problem, jeśli masz pakiet-lock.json z npm 5+. Musisz go usunąć przed użyciem npm install --production.


-1
npm install --dev will install dev dependencies

I, zgodnie z pytaniem, aby zainstalować tylko zależności, pomoże poniższe polecenie

npm install --prod will install dependencies
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.