Comment définir NODE_ENV = production sur Windows?

340

Dans Ubuntu, c'est assez simple; Je peux exécuter l'application en utilisant:

$ NODE_ENV=production node myapp/app.js

Cependant, cela ne fonctionne pas sous Windows. Existe-t-il un fichier de configuration où je peux définir l'attribut?

Jack
la source
Pour une solution multiplateforme, vous pouvez trouver la réponse stackoverflow.com/a/57509175/11127383
Daniel Danielecki

Réponses:

486

Les versions actuelles de Windows utilisent Powershell comme shell par défaut, utilisez donc:

$env:NODE_ENV="production"

Selon la réponse de @ jsalonen ci-dessous. Si vous êtes en CMD (qui n'est plus maintenu), utilisez

set NODE_ENV=production

Cela doit être exécuté dans l'invite de commande où vous avez l'intention d'exécuter votre application Node.js.

La ligne ci-dessus définirait la variable d'environnement NODE_ENV pour l'invite de commande où vous exécutez la commande.

Pour définir les variables d'environnement globalement afin qu'elles persistent au-delà de la seule invite de commande, vous pouvez trouver l'outil dans Système dans le Panneau de configuration (ou en tapant «environnement» dans la zone de recherche du menu Démarrer).

Jani Hartikainen
la source
112
Pour tous ceux qui luttent toujours avec ceci: set NODE_ENV=production && node app. Plus facilement configurer votre package.jsonconséquence: "scripts": { "start": "set NODE_ENV=production && node app" }.
Amberlamps
5
@ShuruiLiu, la commande ne produira rien, mais vous pouvez taper echo %NODE_ENV%pour vérifier sa valeur actuelle.
Jani Hartikainen
169
Attention: "set NODE_ENV = production &&" ajoute un espace de fin à la variable. J'avais besoin de "définir NODE_ENV = production &&" pour éviter l'espace supplémentaire qui casse les applications de nœuds comme Ghost.
daw
12
@Amberlamps qui n'est pas une bonne solution car le NODE_ENV est alors simplement codé en dur pour toutes les machines; le véritable objectif est de changer l'env par machine en utilisant une variable env ou de passer la valeur sur la ligne de commande, pas de la coder en dur dans le fichier package.json.
Alexander Mills,
6
Je pense que l'utilisation cross-envest la meilleure solution à ce problème si votre équipe travaille sur des systèmes d'exploitation mixtes. La réponse de @MoOx serait mon choix comme réponse à cette question.
philk
230

Je viens de trouver un joli package Node.js qui peut beaucoup aider à définir des variables d'environnement à l'aide d'une syntaxe unique, multiplateforme.

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

Cela vous permet d'écrire quelque chose comme ceci:

cross-env NODE_ENV=production my-command

Ce qui est assez pratique! Plus de commandes spécifiques Windows ou Unix!

MoOx
la source
25
Alors que la première réponse est vraie. Je pense que cette réponse est la plus fiable et devrait être utilisée
d4rklit3
C'est une excellente solution!
Kirill Gusyatin
Simple et résout parfaitement mon problème. J'ai pu construire uniquement sur Linux. Cela a résolu à la fois Linux et Windows.
tista3
Cette réponse mérite plus d'amour, devrait être celle acceptée :)
Honza Kalfus
C'est aussi la meilleure réponse pour moi
knaos
166

Dans PowerShell:

$env:NODE_ENV="production"
jsalonen
la source
4
ps: n'oubliez pas le $ et les guillemets;)
George
6
set NODE_ENV=productionn'a pas fonctionné pour moi en PowerShell mais cela a fonctionné. Merci!
rage
6
J'ai lutté un peu pour que cela fonctionne à partir de Powershell dans Visual Studio Code. J'ai pensé laisser la solution ici. J'essayais d'exécuter une commande "Gulp", tout en m'assurant que la valeur env correcte était définie. C'est ce que liquidée travail pour moi: $env:NODE_ENV="development"; gulp runMytask. Notez le point-virgule là-dedans. Le fichier gulp peut utiliser une logique conditionnelle sur process.env.NODE_ENV. À moins que vous ne le définissiez, il ne sera pas défini.
dvsoukup
2
Seule cette solution fonctionne pour moi avec Windows 10 et webpack 3.8.1
Роман Арсеньев
1
Cela fonctionne parfaitement. Mais, l' cross-env NODE_ENV=productionoption est vraiment une meilleure solution si vous exécutez des commandes npm à partir de package.json qui nécessitent la définition de l'env. Il est trop facile de laisser l'ensemble env sur dev / prod après avoir utilisé le $ env: Option NODE_ENV
Drenai
105

Il serait idéal si vous pouviez définir des paramètres sur la même ligne que votre appel pour démarrer Node.js sous Windows. Examinez attentivement ce qui suit et exécutez-le exactement comme indiqué:

Vous avez ces deux options:

  1. Sur la ligne de commande:

    set NODE_ENV=production&&npm start

    ou

    set NODE_ENV=production&&node index.js
  2. L'astuce pour que cela fonctionne sous Windows est que vous devez supprimer les espaces avant et après le "&&". Configuré votre fichier package.json avec start_windows (voir ci-dessous) ci-dessous. Exécutez ensuite "npm run start_windows" sur la ligne de commande.

    //package.json
    
    "scripts": {
      "start": "node index.js"
      "start_windows": "set NODE_ENV=production&&node index.js"
    }
Alexander Mills
la source
1
La DEF aimerait-elle savoir comment le faire fonctionner de cette façon?
SC_Chupacabra
2
A travaillé pour moi. J'ai dû supprimer l'espace blanc "set NODE_ENV = production && nodemon server.js"
SC_Chupacabra
2
J'aurais aimé avoir lu si loin avant d'essayer la réponse ci-dessus, cela m'aurait fait gagner du temps. : \
Jeff
1
Sur une note vaguement liée, j'ai trouvé que && ne fonctionnait pas comme prévu sur Windows lors du chaînage de plusieurs commandes. En cas de doute, essayez d'utiliser | à la place
Mike
1
cela a fonctionné pour moi sur la machine Windows 10 64 bits de cmd et power-shell
Ani
30

Vous pouvez utiliser

npm run env NODE_ENV=production

C'est probablement la meilleure façon de le faire, car il est compatible à la fois avec Windows et Unix.

Dans la documentation du script d'exécution npm :

Le script env est une commande intégrée spéciale qui peut être utilisée pour répertorier les variables d'environnement qui seront disponibles pour le script au moment de l'exécution. Si une commande "env" est définie dans votre package, elle aura priorité sur la commande intégrée.

Brieuc P
la source
3
Comment pouvons-nous exécuter une autre commande avec l'ensemble de variables? Cela ne semble pas fonctionner: npm run env NODE_ENV = production && echo $ NODE_ENV. Ils sont probablement exécutés dans deux obus différents?
Jonas Kello du
1
D'après ce que je peux voir, cela ne fonctionne pas du tout. À partir des documents eux-mêmes, il répertorie uniquement les variables d'environnement, pas les définit.
kumarharsh
2
Ça ne marche pas pour moi. Il répertorie les variables, affiche le var que vous spécifiez, mais à l'exécution, var n'est pas correct dans process.env.YOUR_VAR ...
MoOx
3
@JonasKello Vous utiliseriez ceci: npm run env NODE_ENV=production -- node -e 'console.log(process.env.NODE_ENV)'Le --est obligatoire . Remplacez node -e 'console.log(process.env.NODE_ENV)'par la commande que vous souhaitez.
Pauan
J'ai essayé avec cette commande: npm run env NODE_TLS_REJECT_UNAUTHORIZED=0 -- node --inspect ./etc/http-req-standalone.jset ... rien ne s'est passé. Je ne suis pas sûr que cette méthode fonctionne sur Windows.
jcollum
14

Si vous utilisez Visual Studio avec NTVS, vous pouvez définir les variables d'environnement sur la page des propriétés du projet:

Propriétés du projet Visual Studio NTVS

Comme vous pouvez le voir, les listes déroulantes Configuration et Plateforme sont désactivées (je n'ai pas trop cherché à comprendre pourquoi), mais si vous modifiez votre .njsprojfichier comme suit:

  <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>

La liste déroulante 'Debug / Release' contrôlera ensuite la façon dont la variable est définie avant de démarrer Node.js.

Paul
la source
13

J'ai écrit un module win-node-env avec lequel vous pouvez exécuter votre commande comme vous le feriez dans * nix.

NODE_ENV=production node myapp/app.js

Cela fonctionne en créant un NODE_ENV.cmdqui définit laNODE_ENV variable d'environnement et génère un processus enfant avec le reste de la commande et ses arguments.

Il suffit de l'installer (globalement) et d'exécuter vos commandes de script npm, cela devrait automatiquement les faire fonctionner.

npm install -g win-node-env
laggingreflex
la source
exactement ce que je cherchais! pour fonctionner avec des scripts npm, et cela fonctionne même avec d'autres outils de nœuds cli comme jest. Donc "set NODE_ENV = debug & cls & jest ..." est devenu "cls & NODE_ENV = debug jest"
Z. Khullah
9

Mon expérience avec Node.js sur Windows 7 64 bits dans Visual Studio 2013 est que vous devez utiliser

setx NODE_ENV development

à partir d'une fenêtre cmd. ET vous devez redémarrer Visual Studio pour que la nouvelle valeur soit reconnue.

La syntaxe définie ne dure que pour la durée de la fenêtre cmd dans laquelle elle est définie.

Test simple dans Node.js:

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

Il renvoie «non défini» lors de l'utilisation de set, et il retournera «développement» si vous utilisez setx et redémarrez Visual Studio.

edhubbell
la source
cmd- pas PowerShell? Ugh, viens aux fenêtres, rassemble-le.
jcollum
votre remarque sur le redémarrage du code VS était vraiment utile!
Yury Kozlov
8

Voici la méthode sans ligne de commande:

Sous Windows 7 ou 10, saisissez environnement dans la zone de recherche du menu Démarrer, puis sélectionnez Modifier les variables d'environnement système.

Sinon, accédez à Panneau de configuration \ Système et sécurité \ Système, puis cliquez sur Paramètres système avancés

Cela devrait ouvrir la boîte de dialogue Propriétés système avec l'onglet Avancé sélectionné. En bas, vous verrez un bouton Variables d'environnement .... Cliquez ici.

Boîte de dialogue système

La boîte de dialogue Variables d'environnement s'ouvre.

Boîte de dialogue Variable d'environnement

En bas, sous Variables système, sélectionnez Nouveau ... Cela ouvrira la boîte de dialogue Nouvelle variable système.

entrez la description de l'image ici

Saisissez le nom et la valeur de la variable, puis cliquez sur OK.

Vous devrez fermer toutes les invites cmd et redémarrer votre serveur pour que la nouvelle variable soit disponible pour process.env. S'il ne s'affiche toujours pas, redémarrez votre ordinateur.

Mattatat-tat
la source
2
Je vous remercie! J'avais fait tout cela mais cela ne fonctionnait pas jusqu'à ce que je redémarre le serveur.
Marcel Lamothe
7

Juste pour clarifier, et pour toute autre personne qui pourrait se tirer les cheveux ...

Si vous utilisez git bash sous Windows , set node_env=production&& node whatever.js cela ne semble pas fonctionner . Utilisez plutôt la cmd native. Ensuite, en utilisantset node_env=production&& node whatever.js travaux comme prévu.

Mon cas d'utilisation:

Je développe sur Windows car mon flux de travail est beaucoup plus rapide, mais je devais m'assurer que le middleware spécifique au développement de mon application ne se déclenchait pas dans l'environnement de production.

pstrawberriedev
la source
6

Pour exécuter votre application dans PowerShell (depuis &&n'est pas autorisé):

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

Notez que la sortie texte de ce que fait le serveur est supprimée, et je ne suis pas sûr que ce soit réparable. (Développant la réponse de @ jsalonen.)

Cameron Yick
la source
Ça n'a pas marché pour moi:"debug-windows": "($env:NODE_ENV=\"dev\") -and (node src/dequeue.js)"
Evandro Pomatti
4

premier du type PowerShell

$env:NODE_ENV="production"

puis tapez

node fileName.js

Il fonctionnera parfaitement en affichant toutes les sorties.

Abhinav
la source
2

Pour plusieurs variables d'environnement, un .envfichier est plus pratique:

# .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

Il est facile à utiliser avec dotenv-safe:

  1. Installer avec npm install --save dotenv-safe .
  2. Incluez-le dans votre code (mieux au début de index.js) et utilisez-le directement avec la process.envcommande :
require('dotenv').load()
console.log(process.env.DB_HOST)   

N'oubliez pas d' ignorer le .envfichier dans votre VCS .

Votre programme échoue alors rapidement si une variable "définie" dans .env.examplen'est pas définie en tant que variable d'environnement ou dans .env.

Dominik
la source
Les fichiers .env ne sont pratiques que pour les secrets et ajoutent une étape supplémentaire de complexité lors de la configuration lors de l'affectation de nouvelles personnes à un projet ou de leur apporter des modifications.
coiso
@coiso Sans un lieu générique, commune où vous mettez beaucoup de variables d'environnement? Que ce soit dans un fichier de script ou dans un paramètre dépendant de l'IDE, vous êtes encore plus lié à des outils spécifiques. Cela rend l'intégration des nouveaux membres de l'équipe encore plus difficile, je pense.
Dominik
2

Dans le cas où vous utilisez le terminal GITBASH "set NODE_ENV=production" ne fonctionnera pas, que pouvez-vous faire est de taper "exportNODE_ENV=production"

Bozhinovski
la source
0

cela ne définira pas de variable mais c'est utile dans de nombreux cas. Je ne recommanderai pas d'utiliser cela pour la production, mais ça devrait aller si vous jouez avec npm.

npm install --production
Bar Horing
la source
0

J'ai utilisé le script npm pour exécuter une tâche gulp sans "&&"

NODE_ENV = testcases npm run seed-db

Mari Orlova
la source
0

Redémarrez le code VS si le NODE_ENV ou toute autre variable d'environnement ne fournit pas la valeur correcte. Cela devrait fonctionner après le redémarrage.

Rakesh Pahuja
la source