Wie kann ich NODE_ENV = Produktion unter Windows festlegen?

340

In Ubuntu ist es ganz einfach; Ich kann die Anwendung ausführen mit:

$ NODE_ENV=production node myapp/app.js

Dies funktioniert jedoch nicht unter Windows. Gibt es eine Konfigurationsdatei, in der ich das Attribut festlegen kann?

Jack
quelle
Für eine Multiplattform-Lösung finden Sie die Antwort stackoverflow.com/a/57509175/11127383
Daniel Danielecki

Antworten:

485

Aktuelle Windows-Versionen verwenden Powershell als Standard-Shell. Verwenden Sie daher:

$env:NODE_ENV="production"

Per @ jsalonens Antwort unten. Wenn Sie sich in CMD befinden (das nicht mehr verwaltet wird), verwenden Sie

set NODE_ENV=production

Dies sollte an der Eingabeaufforderung ausgeführt werden, an der Sie Ihre Node.js-Anwendung ausführen möchten.

In der obigen Zeile wird die Umgebungsvariable NODE_ENV für die Eingabeaufforderung festgelegt, an der Sie den Befehl ausführen.

Um Umgebungsvariablen global so festzulegen, dass sie über die einzelne Eingabeaufforderung hinaus bestehen, finden Sie das Tool in der Systemsteuerung im System (oder indem Sie im Startmenü "Umgebung" in das Suchfeld eingeben).

Jani Hartikainen
quelle
112
Für alle, die noch damit zu kämpfen haben : set NODE_ENV=production && node app. Konfigurieren Sie Ihre bequemer package.jsonentsprechend : "scripts": { "start": "set NODE_ENV=production && node app" }.
Amberlamps
5
@ShuruiLiu Der Befehl gibt nichts aus, aber Sie können eingeben echo %NODE_ENV%, um den aktuellen Wert zu überprüfen.
Jani Hartikainen
169
Heads up: "set NODE_ENV = Production &&" fügt der Variablen ein nachfolgendes Leerzeichen hinzu. Ich brauchte "set NODE_ENV = Production &&", um den zusätzlichen Speicherplatz zu vermeiden, der Knoten-Apps wie Ghost zerstört.
Morgen,
12
@Amberlamps das ist keine gute Lösung, da der NODE_ENV dann nur für alle Maschinen fest codiert ist; Das eigentliche Ziel besteht darin, die Umgebung mithilfe einer Umgebungsvariablen maschinell zu ändern oder den Wert in der Befehlszeile zu übergeben und nicht in der Datei package.json fest zu codieren.
Alexander Mills
6
Ich denke, die Verwendung cross-envist die bessere Lösung für dieses Problem, wenn Ihr Team mit gemischten Betriebssystemen arbeitet. Die Antwort von @MoOx wäre meine Wahl als Antwort auf diese Frage.
Philk
229

Ich habe gerade ein nettes Node.js-Paket gefunden, das viel dazu beitragen kann, Umgebungsvariablen mithilfe einer einzigartigen, plattformübergreifenden Syntax zu definieren.

https://www.npmjs.com/package/cross-env

Sie können so etwas schreiben:

cross-env NODE_ENV=production my-command

Welches ist ziemlich praktisch! Keine Windows- oder Unix-spezifischen Befehle mehr!

MoOx
quelle
25
Während die erste Antwort wahr ist. Ich denke, diese Antwort ist am zuverlässigsten und sollte verwendet werden
d4rklit3
Dies ist eine großartige Lösung!
Kirill Gusyatin
Einfach und perfekt löst mein Problem. Ich konnte nur auf Linux bauen. Dies löste sowohl Linux als auch Windows.
Tista3
Diese Antwort verdient mehr Liebe, sollte die akzeptierte sein :)
Honza Kalfus
Dies ist auch die beste Antwort für mich
Knaos
166

In PowerShell:

$env:NODE_ENV="production"
jsalonen
quelle
4
ps: vergiss nicht das $ und die Anführungszeichen;)
George
6
set NODE_ENV=productionhat bei Powershell nicht für mich funktioniert, aber das hat funktioniert. Vielen Dank!
Wut
6
Ich habe mich ein wenig bemüht, dies von Powershell in Visual Studio Code zum Laufen zu bringen. Ich dachte, ich würde die Lösung hier lassen. Ich habe versucht, einen "Gulp" -Befehl auszuführen, während sichergestellt wurde, dass der richtige env-Wert festgelegt wurde. Das ist es, was für mich funktioniert hat : $env:NODE_ENV="development"; gulp runMytask. Beachten Sie das Semikolon dort. Die gulp-Datei kann eine bedingte Logik für process.env.NODE_ENV verwenden. Wenn Sie es nicht einstellen, ist es undefiniert.
dvsoukup
2
Nur diese Lösung funktioniert für mich mit Windows 10 und Webpack 3.8.1
Арсеньев
1
Das funktioniert perfekt. Die cross-env NODE_ENV=productionOption ist jedoch eine bessere Lösung, wenn npm-Befehle aus package.json ausgeführt werden, für die die Umgebung festgelegt werden muss. Es ist zu einfach, die Umgebung auf dev / prod zu setzen, nachdem die Option $ env: NODE_ENV
Drenai
105

Es wäre ideal, wenn Sie Parameter in derselben Zeile wie Ihr Aufruf zum Starten von Node.js unter Windows festlegen könnten. Schauen Sie sich Folgendes genau an und führen Sie es genau wie angegeben aus:

Sie haben zwei Möglichkeiten:

  1. In der Befehlszeile:

    set NODE_ENV=production&&npm start

    oder

    set NODE_ENV=production&&node index.js
  2. Der Trick, damit es unter Windows funktioniert, besteht darin, das Leerzeichen vor und nach dem "&&" zu entfernen. Konfigurieren Sie Ihre package.json-Datei mit start_windows (siehe unten) unten. Führen Sie dann "npm run start_windows" in der Befehlszeile aus.

    //package.json
    
    "scripts": {
      "start": "node index.js"
      "start_windows": "set NODE_ENV=production&&node index.js"
    }
Alexander Mills
quelle
1
Würde DEF gerne wissen, wie es so funktioniert?
SC_Chupacabra
2
Hat für mich gearbeitet. Musste das Leerzeichen entfernen, obwohl "Setze NODE_ENV = Produktion && nodemon server.js"
SC_Chupacabra
2
Ich wünschte, ich hätte so weit vorgelesen, bevor ich die obige Antwort ausprobiert hätte, hätte mir etwas Zeit gespart. : \
Jeff
1
In einem vagen Zusammenhang stellte ich fest, dass && unter Windows nicht wie erwartet funktionierte, wenn mehrere Befehle miteinander verkettet wurden. Im Zweifelsfall versuchen Sie es mit | stattdessen
Mike
1
Dies funktionierte für mich auf Windows 10 64-Bit-Computer von cmd und Power-Shell
Ani
30

Sie können verwenden

npm run env NODE_ENV=production

Dies ist wahrscheinlich der beste Weg, da es sowohl unter Windows als auch unter Unix kompatibel ist.

Aus der npm-Run-Script-Dokumentation :

Das env-Skript ist ein spezieller integrierter Befehl, mit dem Umgebungsvariablen aufgelistet werden können, die dem Skript zur Laufzeit zur Verfügung stehen. Wenn in Ihrem Paket ein "env" -Befehl definiert ist, hat dieser Vorrang vor dem integrierten.

Brieuc P.
quelle
3
Wie können wir einen anderen Befehl mit der eingestellten Variablen ausführen? Dies scheint nicht zu funktionieren: npm run env NODE_ENV = Produktion && echo $ NODE_ENV. Wahrscheinlich werden sie in zwei verschiedenen Schalen ausgeführt?
Jonas Kello
1
Soweit ich sehen kann, funktioniert dies überhaupt nicht. Aus der Dokumentation selbst, Es ist nur die Auflistung von Umgebungsvariablen, das Setzen von ihnen nicht.
Kumarshar
2
Funktioniert bei mir nicht Es listet vars auf, zeigt die von Ihnen angegebene var an, aber zur Laufzeit ist var in
process.env.YOUR_VAR
3
@ JonasKello Sie würden dies verwenden: npm run env NODE_ENV=production -- node -e 'console.log(process.env.NODE_ENV)'Das --ist obligatorisch . Ersetzen Sie node -e 'console.log(process.env.NODE_ENV)'durch einen beliebigen Befehl.
Pauan
Versuchte dies mit diesem Befehl: npm run env NODE_TLS_REJECT_UNAUTHORIZED=0 -- node --inspect ./etc/http-req-standalone.jsund ... nichts ist passiert. Ich bin nicht sicher, ob diese Methode unter Windows funktioniert.
JCollum
14

Wenn Sie Visual Studio mit NTVS verwenden, können Sie die Umgebungsvariablen auf der Projekteigenschaftenseite festlegen:

Visual Studio NTVS-Projekteigenschaften

Wie Sie sehen können, sind die Dropdown-Listen "Konfiguration" und "Plattform" deaktiviert (ich habe nicht zu genau untersucht, warum dies so ist). Wenn Sie Ihre .njsprojDatei jedoch wie folgt bearbeiten :

  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <DebugSymbols>true</DebugSymbols>
    <Environment>NODE_ENV=development</Environment>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
    <DebugSymbols>true</DebugSymbols>
    <Environment>NODE_ENV=production</Environment>
  </PropertyGroup>

Das Dropdown-Menü 'Debug / Release' steuert dann, wie die Variable festgelegt wird, bevor Node.js gestartet wird.

paul
quelle
12

Ich habe ein Modul win-node-env geschrieben, mit dem Sie Ihren Befehl wie in * nix ausführen können.

NODE_ENV=production node myapp/app.js

Es erstellt eine NODE_ENV.cmd, die die NODE_ENVUmgebungsvariable festlegt und einen untergeordneten Prozess mit dem Rest des Befehls und seinen Argumenten erzeugt.

Installieren Sie es einfach (global) und führen Sie Ihre npm-Skriptbefehle aus. Es sollte automatisch funktionieren.

npm install -g win-node-env
Laggingreflex
quelle
genau das, wonach ich gesucht habe! mit npm-Skripten auszuführen, und es funktioniert sogar mit anderen Node-CLI-Tools wie Jest. Also wurde "set NODE_ENV = debug & cls & jest ..." zu "cls & NODE_ENV = debug jest"
Z. Khullah
9

Meine Erfahrung mit Node.js unter Windows 7 64-Bit in Visual Studio 2013 ist, dass Sie verwenden müssen

setx NODE_ENV development

aus einem cmd-Fenster. UND Sie müssen Visual Studio neu starten, damit der neue Wert erkannt wird.

Die festgelegte Syntax gilt nur für die Dauer des cmd-Fensters, in dem sie festgelegt ist.

Einfacher Test in Node.js:

console.log('process.env.NODE_ENV = ' + process.env.NODE_ENV);

Bei Verwendung von set wird 'undefined' zurückgegeben, bei Verwendung von setx und Neustart von Visual Studio wird 'development' zurückgegeben.

Edhubbell
quelle
cmd- keine Powershell? Ugh, komm an die Fenster, bring es zusammen.
JCollum
Ihre Bemerkung zum Neustart von VS-Code war wirklich nützlich!
Yury Kozlov
8

Hier ist die Nicht-Befehlszeilenmethode:

Geben Sie unter Windows 7 oder 10 Umgebung in das Suchfeld des Startmenüs ein und wählen Sie Systemumgebungsvariablen bearbeiten.

Navigieren Sie alternativ zu Systemsteuerung \ System und Sicherheit \ System und klicken Sie auf Erweiterte Systemeinstellungen

Dies sollte das Dialogfeld Systemeigenschaften mit der ausgewählten Registerkarte Erweitert öffnen. Unten sehen Sie eine Schaltfläche Umgebungsvariablen. Klicke hier.

Systemdialogfeld

Das Dialogfeld Umgebungsvariablen wird geöffnet.

Dialogfeld "Umgebungsvariable"

Wählen Sie unten unter Systemvariablen die Option Neu aus. Dadurch wird das Dialogfeld Neue Systemvariable geöffnet.

Geben Sie hier die Bildbeschreibung ein

Geben Sie den Variablennamen und den Wert ein und klicken Sie auf OK.

Sie müssen alle cmd-Eingabeaufforderungen schließen und Ihren Server neu starten, damit die neue Variable für process.env verfügbar ist. Wenn es immer noch nicht angezeigt wird, starten Sie Ihren Computer neu.

Mattatat-tat
quelle
2
Vielen Dank! Ich hatte das alles getan, aber es funktionierte nicht, bis ich den Server neu startete.
Marcel Lamothe
7

Nur zur Klarstellung und für alle anderen, die sich die Haare ausreißen ...

Wenn Sie Git Bash unter Windows verwenden , set node_env=production&& node whatever.js scheint dies nicht zu funktionieren . Verwenden Sie stattdessen das native cmd. Dann set node_env=production&& node whatever.jsfunktioniert die Verwendung wie erwartet.

Mein Anwendungsfall:

Ich entwickle unter Windows, weil mein Workflow viel schneller ist, aber ich musste sicherstellen, dass die entwicklungsspezifische Middleware meiner Anwendung nicht in der Produktionsumgebung ausgelöst wurde.

pstrawberriedev
quelle
6

So führen Sie Ihre Anwendung in PowerShell aus (da dies &&nicht zulässig ist):

($env:NODE_ENV="production") -and (node myapp/app.js)

Beachten Sie, dass die Textausgabe der Serverfunktionen unterdrückt wird und ich nicht sicher bin, ob dies behoben werden kann. (Erweiterung der Antwort von @ jsalonen.)

Cameron Yick
quelle
Es hat bei mir nicht funktioniert:"debug-windows": "($env:NODE_ENV=\"dev\") -and (node src/dequeue.js)"
Evandro Pomatti
4

zuerst in Powershell-Typ

$env:NODE_ENV="production"

Geben Sie dann ein

node fileName.js

Es funktioniert perfekt, wenn alle Ausgänge angezeigt werden.

Abhinav
quelle
2

Für mehrere Umgebungsvariablen ist eine .envDatei bequemer:

# .env.example, committed to repo
DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3
# .env, private, .gitignore it
DB_HOST=real-hostname.example.com
DB_USER=real-user-name
DB_PASS=REAL_PASSWORD

Es ist einfach zu bedienen mit dotenv-safe:

  1. Installieren mit npm install --save dotenv-safe.
  2. Fügen Sie es in Ihren Code ein (am besten am Anfang von index.js) und verwenden Sie es direkt mit dem process.envBefehl :
require('dotenv').load()
console.log(process.env.DB_HOST)   

Vergessen Sie nicht , die .envDatei in Ihrem VCS zu ignorieren .

Ihr Programm schlägt dann schnell fehl, wenn eine in "definierte" Variable .env.exampleentweder als Umgebungsvariable oder in nicht festgelegt ist .env.

Dominik
quelle
.env-Dateien sind nur für Geheimnisse geeignet und erhöhen die Komplexität beim Einrichten, wenn einem Projekt neue Personen zugewiesen oder Änderungen an ihnen vorgenommen werden.
Coiso
@coiso Wo platzieren Sie ohne einen generischen, gemeinsamen Ort viele env-Variablen? Entweder in einer Skriptdatei oder in einer IDE-abhängigen Einstellung sind Sie noch stärker an bestimmte Tools gebunden. Dies macht die Integration neuer Teammitglieder meiner Meinung nach noch schwieriger.
Dominik
2

Wenn Sie das GITBASH-Terminal verwenden, funktioniert "set NODE_ENV=production" es nicht. Geben Sie "export" einNODE_ENV=production"

Bozhinovski
quelle
0

Dadurch wird keine Variable festgelegt, aber es ist in vielen Fällen nützlich. Ich werde nicht empfehlen, dies für die Produktion zu verwenden, aber es sollte in Ordnung sein, wenn Sie mit npm herumspielen.

npm install --production
Bar Horing
quelle
0

Ich habe das npm-Skript verwendet, um eine Schluckaufgabe ohne "&&" auszuführen.

NODE_ENV = Testfälle npm run seed-db

Mari Orlova
quelle
0

Starten Sie den VS-Code neu, wenn NODE_ENV oder eine andere Umgebungsvariable keinen korrekten Wert liefert. Dies sollte nach dem Neustart funktionieren.

Rakesh Pahuja
quelle