Wie verhindern Sie die Installation von NPM-Modulen für "devDependencies" für Node.js (package.json)?

587

Ich habe dies in meiner package.json-Datei (verkürzte Version):

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

Ich verwende NPM Version 1.1.1 auf Mac 10.6.8.

Wenn ich den folgenden Befehl im Projektstamm ausführe, werden sowohl der dependencies als auch installiert devDependencies:

npm install

Ich hatte den Eindruck, dass dieser Befehl Folgendes installierte devDependencies:

npm install --dev

Wie mache ich es so, dass npm installnur installiert wird dependencies(so dass die Produktionsumgebung nur diese Module erhält), während so etwas npm install --devsowohl beide dependenciesals auch installiert devDependencies?

Lance Pollard
quelle
1
Laut dem Dokument haben Sie Recht, das --dev installiert die devdeps, ansonsten nur die deps. npmjs.org/doc/json.html . Ich weiß, dass dies zumindest für benannte Pakete funktioniert.
Mna
1
Wenn Sie 2015 auf diese Frage stoßen, führt der Schalter --save-dev den Trick genau so aus, wie er in dieser Frage gestellt wird.
Anand
1
Diese Antwort stackoverflow.com/a/22004559/3718119 gibt eine schöne Erklärung für die Unterschiede zwischen dependenciesund devDependenciesund wann jeder von ihnen verwendet wird.
Quasoft

Antworten:

844

Der npm installBefehl installiert das devDependencieszusammen mit anderen, dependencieswenn es in einem Paketverzeichnis in einer Entwicklungsumgebung ausgeführt wird (Standardeinstellung).

Verwenden Sie npm install --only=prod(oder --only=production) zu installieren , nur dependencies , und nicht devDependencies,unabhängig von dem Wert der NODE_ENVUmgebungsvariablen.

Quelle: npm docs

Hinweis: Vor Version 3.3.0 von npm (13.08.2015) wurde die Option aufgerufen --production, d npm install --production. H.

Rohan Singh
quelle
2
Agates Argumentation ist wahrscheinlich, devDependencies zu entfernen, damit Verbraucher, die Ihr Paket mit installieren npm install yourpackage.tgz, nicht auch die devDependencies erhalten. Dies ist jedoch bereits der Fall. Siehe die Antwort von Kevin Cox unten ( stackoverflow.com/a/15826602/825588 ).
Johann
5
npmjs.org/doc/cli/npm-install.html "Standardmäßig installiert npm install alle als Abhängigkeiten aufgelisteten Module. Mit dem Flag --production installiert npm keine in devDependencies aufgelisteten Module."
TomByrer
14
Oh mein Gott. Ich hatte total NODE_ENV=productionetwas anderes, was ich tat, und konnte für mein Leben nicht herausfinden, warum ich npm installkeine Abhängigkeiten installieren sollte. Danke für die gründliche Antwort.
aendrew
1
npm install --dev würde nur dev Abhängigkeiten installieren
Rustem K
10
Ab npm 3.3: npm WARN install Die Verwendung der --devOption ist veraltet. Verwenden Sie --only=devstattdessen.
srcspider
232

Ich stoße auch auf dieses Problem! Die Installation von npm ist etwas verwirrend und Webposts bringen immer wieder die Flags -d / - dev ein, als ob es einen expliziten Installationsmodus für die Entwicklung gäbe.

  • npm installinstalliert sowohl " Abhängigkeiten " als auch " devDependencies "

  • npm install --productioninstalliert nur " Abhängigkeiten "

  • npm install --devinstalliert nur " devDependencies "

smertrios
quelle
29
WARNUNG: Wenn diese Option aktiviert NODE_ENVist productionund Sie sie ausführen npm install, werden keine Entwicklungsabhängigkeiten installiert. Ich bin in meiner Docker-Datei auf dieses Problem gestoßen.
Vaughan
1
@vaughan Ich bin auch darauf gestoßen, kann durch Laufen gelöst werden npm --production=false install(obwohl ich nicht sicher bin, ob dies neben der --dev-Flagge funktioniert)
Bavell
138

Die neue Option lautet:

npm install --only=prod

Wenn Sie nur devDependencies installieren möchten:

npm install --only=dev
Cloxure
quelle
1
Dies beantwortet das Gegenteil der Frage. OP fragt, wie devDependencies NICHT installiert werden sollen.
musicin3d
2
Sie sind teilweise richtig @ musicin3d, deshalb habe ich im ersten Teil geantwortet, wie man nur Prod-Abhängigkeiten installiert und im zweiten Teil, wie man nur Dev-Abhängigkeiten installiert, nur für den Fall.
Cloxure
5
Sie da. Ich habe diesen Kommentar hinterlassen, bevor @ user1614572 den Teil über hinzugefügt hat --only=prod. Sie, Sir, haben teilweise recht. ; P
musicin3d
Können wir eine separate Abhängigkeit für die Bereitstellung einschließen?
Jeeva Jsb
1
Es ist ein Kommentar, keine Antwort. Ich überprüfe nicht regelmäßig alle meine Kommentare. Ich habe noch nie Leute gesehen, die Kommentare von vor Jahren aktualisiert haben. Sie sind im Grunde genommen hierher gekommen, um zu kritisieren, dass ich meinem Kommentar ein Jahr gegeben habe. Ich werde nicht weiter antworten. Viel Spaß beim Trolling anderer Leute.
Jacques
47

Wenn Sie diesen POST im Jahr 2016 lesen, erreichen Sie bitte mit

--only={prod[uction]|dev[elopment]} 

Das Argument führt dazu, dass unabhängig vom NODE_ENV entweder nur devDependencies oder nur Nicht-devDependencies installiert werden.

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

wzr1337
quelle
Warum "POST" groß schreiben? docs.npmjs.com/cli/install dokumentiert sowohl BEIDE --productionals auch --only={prod[uction]|dev[elopment]}.
Dan Dascalescu
33

Wenn Sie bereits alle Ihre Abhängigkeiten installiert haben und vermeiden möchten, dass Sie Ihre Produktionspakete erneut von NPM herunterladen müssen, können Sie einfach Folgendes eingeben:

npm prune --production

Dadurch werden Ihre Entwicklungsabhängigkeiten aus Ihrem node_modulesOrdner entfernt. Dies ist hilfreich, wenn Sie versuchen, einen zweistufigen Prozess wie zu automatisieren

  1. Webpack mein Projekt mit Dev-Abhängigkeiten
  2. Erstellen Sie ein Docker-Image nur mit Produktionsmodulen

Wenn Sie npm prunezwischendurch laufen, müssen Sie nicht alles neu installieren!

Piercebot
quelle
19

Bei Verwendung von "npm install" werden die Module geladen und sind in Ihrer gesamten Anwendung verfügbar, unabhängig davon, ob es sich um "devDependencies" oder "dependencies" handelt. Summe dieser Idee: Alles, was Ihre package.json als Abhängigkeit definiert (jeder Typ), wird in node_modules installiert.

Der Grund für den Unterschied zwischen Abhängigkeiten / devDependencies / optionalDependencies ist, was Konsumenten Ihres Codes mit npm tun können, um diese Ressourcen zu installieren.

Gemäß der Dokumentation: https://npmjs.org/doc/json.html ...

Wenn jemand vorhat, Ihr Modul in seinem Programm herunterzuladen und zu verwenden, möchte oder muss er das von Ihnen verwendete externe Test- oder Dokumentationsframework wahrscheinlich nicht herunterladen und erstellen.

In diesem Fall ist es am besten, diese zusätzlichen Elemente in einem devDependencies-Hash aufzulisten.

Diese Dinge werden immer dann installiert, wenn das Konfigurationsflag --dev gesetzt ist. Dieses Flag wird automatisch gesetzt, wenn eine npm-Verknüpfung oder eine npm-Installation über das Stammverzeichnis eines Pakets durchgeführt wird, und kann wie jeder andere npm-Konfigurationsparameter verwaltet werden. Weitere Informationen zum Thema finden Sie in config (1).

Um diese Frage zu lösen, lautet der folgende Befehl, wenn Sie NUR die "Abhängigkeiten" mit npm installieren möchten:

npm install --production

Dies kann durch einen Blick auf das Git-Commit bestätigt werden, das diesen Filter hinzugefügt hat (zusammen mit einigen anderen Filtern [unten aufgeführt], um diese Funktionalität bereitzustellen).

Alternative Filter, die von npm verwendet werden können:

--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 versuche mit npm install --production

Creatovisguru
quelle
16

npm installiert dev-Abhängigkeiten bei der Installation innerhalb eines Pakets (falls sich package.jsonim aktuellen Verzeichnis eine befindet). Wenn es von einem anderen Speicherort stammt (npm-Registrierung, Git Repo, anderer Speicherort im Dateisystem), werden nur die Abhängigkeiten installiert.

Kevin Cox
quelle
Könnten Sie bitte umformulieren? Ich denke, Sie haben einen Fehler in Ihrer Klammer gemacht. Ich denke, Sie haben vergessen, ihn früher zu schließen, und Ihre Frase macht für mich (nicht englischer Muttersprachler) wenig Sinn. Johanns Kommentar unter der Antwort von Rohan Singh wies mich an, auf Ihre Antwort zu schauen (weil mein Zweifel genau der gleiche war wie der Zweifel von Achat), und kein Erfolg. Ich verstehe es immer noch nicht, wie man npm install some-modulekeine Dev-Abhängigkeiten von installiert some-module.
Rafael Eyng
Danke, behoben. Ich verstehe den Rest Ihrer Frage jedoch nicht.
Kevin Cox
3

Ich habe festgestellt, dass Sie beim Installieren von Dev-Abhängigkeiten für ein Paket, das ein Knoten-Addon enthält, das Erstellen des Addons beim Ausführen von npm install --dev nicht vermeiden können, selbst wenn Sie nur die devDependencies installieren möchten. Also musste ich um npm's Rücken herumgehen:

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

Oder noch besser (und prägnanter),

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

Mit npm install packageName --savedieser Option wird ein Paket in Abhängigkeiten hinzugefügt , wenn Sie verwenden npm install packageName --save-devdann devDependencies .

npm install packageName --save-devsollte zum Hinzufügen von Paketen für Entwicklungszwecke verwendet werden. Wie das Hinzufügen von TDD-Paketen (Chai, Mokka usw.). Welche werden in der Entwicklung und nicht in der Produktion verwendet.

Sandip Nirmal
quelle
Das OP hat kein Problem beim Speichern von Abhängigkeiten, package.jsonaber sobald diese Abhängigkeiten bereits gespeichert sind , können Sie die npmInstallation nur eines bestimmten Abhängigkeitstyps erzwingen. Als ich Ihre Antwort hier las, habe ich nichts gelernt, was zur Lösung des vom OP aufgeworfenen Problems beitragen könnte.
Louis
3

Es ist erwähnenswert, dass Sie die NODE_ENVUmgebungsvariable verwenden können, um das gleiche Ergebnis zu erzielen. Besonders nützlich, wenn Sie Ihre Node-Anwendung (z. B. Docker) containerisieren.

NODE_ENV=production npm install

Der obige Code installiert alle Ihre Abhängigkeiten außer den Entwickler-Abhängigkeiten (dh devDependencies).

Wenn Sie Umgebungsvariablen Dockerfileverwenden müssen, finden Sie hier weitere Informationen .

Umgebungsvariablen können bei Bedarf leicht überschrieben werden (z. B. wenn Sie Ihre Testsuite beispielsweise auf Travis CI ausführen möchten). Wenn das der Fall wäre, könnten Sie so etwas tun:

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

NPM-Dokumentation hier

Produktion

  • Standard: false
  • Typ: Boolean Auf true setzen, um im "Produktions" -Modus ausgeführt zu werden.

    1. devDependencies werden nicht auf der obersten Ebene installiert, wenn die lokale npm-Installation ohne Argumente ausgeführt wird.
    2. Setzen Sie NODE_ENV = "Produktion" für Lebenszyklus-Skripte.

Glückliche Containerisierung =)

Francesco Casula
quelle
3

Ich schlage vor, zu verwenden npm ci. Wenn Sie nur produktionsbedürftige Pakete installieren möchten (wie Sie geschrieben haben - ohne devDependencies), dann:

npm ci --only=production

oder

NODE_ENV=production npm ci

Wenn Sie Oldschool bevorzugen, npm installdann:

npm install --production

oder

NODE_ENV=production npm install

Hier ist eine gute Antwort, warum Sie verwenden sollten npm ci.

Marverix
quelle
Cool, es funktioniert npm ciauch, nicht nur npm install!
Klesun
2

Zur ausgewählten Antwort muss hinzugefügt werden: Ab sofort werden npm installin einem Paketverzeichnis (das enthält package.json) devDependencies installiert, während npm install -gsie nicht installiert werden.

ack
quelle
7
Ja, -gwird nicht installiert devDependencies, aber die Pakete werden global installiert, was häufig nicht das beabsichtigte Ergebnis ist.
Bardi Harborow
0

npm install --productionist der richtige Weg, um Knotenmodule zu installieren, die für die Produktion benötigt werden. Weitere Informationen finden Sie in der Dokumentation

Rubin Bhandari
quelle
-1

Jetzt gibt es ein Problem, wenn Sie package-lock.json mit npm 5+ haben. Sie müssen es vor der Verwendung von entfernen npm install --production.

Erich Stark
quelle
-1
npm install --dev will install dev dependencies

Und gemäß der Frage, nur Abhängigkeiten zu installieren, hilft der folgende Befehl

npm install --prod will install dependencies
karthiks416
quelle