web-dev-qa-db-fra.com

Comment définir des variables d'environnement à partir de package.json

Comment définir certaines variables d'environnement depuis package.json à utiliser avec npm start comme des commandes?

Voici ce que j'ai actuellement dans mon package.json:

{
  ...
  "scripts": {
    "help": "tagove help",
    "start": "tagove start"
  }
  ...
}

Je souhaite définir des variables d'environnement (comme NODE_ENV) dans le script de démarrage tout en pouvant démarrer l'application avec une seule commande, npm start.

232
dev.meghraj

Définissez la variable d'environnement dans la commande de script:

...
"scripts": {
  "start": "node app.js",
  "test": "NODE_ENV=test mocha --reporter spec"
},
...

Ensuite, utilisez process.env.NODE_ENV dans votre application.

Remarque: Ceci est pour Mac et Linux uniquement. Pour Windows, reportez-vous aux commentaires.

316
cesar

Utilisez simplement le package NPM cross-env . Super facile. Fonctionne sur Windows, Linux et tous les environnements. Notez que vous n'utilisez pas && pour passer à la tâche suivante. Vous venez de définir le env et puis démarrez la tâche suivante. Merci à @ mikekidder pour la suggestion en n des commentaires ici.

De la documentation:

{
  "scripts": {
    "build": "cross-env NODE_ENV=production OTHERFLAG=myValue webpack --config build/webpack.config.js"
  }
}

Notez que si vous souhaitez définir plusieurs vars globaux, il vous suffit de les énoncer successivement, suivis de votre commande à exécuter.

Finalement, la commande qui est exécutée (en utilisant spawn) est:

webpack --config build/webpack.config.js

La variable d'environnement NODE_ENV sera définie par cross-env

182
TetraDev

Je voulais juste ajouter mes deux cents ici pour les futurs explorateurs de nœuds. Sur mon Ubuntu 14.04, le NODE_ENV=test ne fonctionnait pas, je devais utiliser export NODE_ENV=test après quoi NODE_ENV=test avait également commencé à fonctionner, bizarre.

Sous Windows, il a été dit que vous devez utiliser set NODE_ENV=test, mais pour une solution multiplate-forme, la bibliothèque cross-env ne semblait pas faire l'affaire et vous avez vraiment besoin d'une bibliothèque pour le faire:

export NODE_ENV=test || set NODE_ENV=test&& yadda yadda

Les barres verticales sont nécessaires, sinon Windows se bloquerait sur la commande non reconnue export NODE_ENV: D. Je ne sais pas à propos de l'espace de fuite mais juste pour être sûr de les supprimer aussi.

34
TeemuK

Comme je travaille souvent avec plusieurs variables d’environnement, il est utile de les conserver dans un fichier .env séparé (assurez-vous de ne pas en tenir compte dans votre contrôle de code source).

VAR_A=Hello World
VAR_B=format the .env file like this with new vars separated by a line break

Puis ajoutez export $(cat .env | xargs) && avant votre commande de script.

Exemple:

{
  ...
  "scripts": {
    ...
    "start": "export $(cat .env | xargs) && echo do your thing here",
    "env": "export $(cat .env | xargs) && env",
    "env-windows": "export $(cat .env | xargs) && set"
  }
  ...
}

Pour un test, vous pouvez afficher les variables env en exécutant npm run env (linux) ou npm run env-windows (windows).

10
Luke

soudainement, j'ai découvert que l'actionhero utilisait le code suivant, ce qui a résolu mon problème en passant simplement --NODE_ENV=production dans l'option de commande de script de démarrage.

if(argv['NODE_ENV'] != null){
  api.env = argv['NODE_ENV'];
} else if(process.env.NODE_ENV != null){
  api.env = process.env.NODE_ENV;
}

j'apprécierais vraiment d'accepter la réponse de quelqu'un d'autre qui connaîtrait mieux la manière de définir les variables d'environnement dans package.json ou le script init ou quelque chose comme, où l'application a été démarrée par quelqu'un d'autre.

7
dev.meghraj

Essayez ceci sous Windows en remplaçant YOURENV:

  {
    ...
     "scripts": {
       "help": "set NODE_ENV=YOURENV&& tagove help",
       "start": "set NODE_ENV=YOURENV&& tagove start"
     }
    ...
  }
5
Pascal Mayr

Pour un plus grand ensemble de variables d’environnement ou lorsque vous souhaitez les réutiliser, vous pouvez utiliser env-cmd .

_./.env_ fichier:

_# This is a comment
ENV1=THANKS
ENV2=FOR ALL
ENV3=THE FISH
_

_./package.json_:

_{
  "scripts": {
    "test": "env-cmd mocha -R spec"
  }
}
_
2
KARASZI István

Bien que ne répondant pas directement à la question, je voudrais partager une idée en plus des autres réponses. D'après ce que j'ai obtenu, chacun de ces éléments offrirait un certain niveau de complexité pour parvenir à une indépendance multiplateforme.

Sur mon scénario, tout ce que je voulais, à l'origine, définir une variable pour contrôler si le serveur doit être sécurisé avec l'authentification JWT (à des fins de développement)

Après avoir lu les réponses, j'ai simplement décidé de créer 2 fichiers différents, avec authentification activée et désactivée respectivement.

  "scripts": {
    "dev": "nodemon --debug  index_auth.js",
    "devna": "nodemon --debug  index_no_auth.js",
  }

Les fichiers sont simplement des wrappers qui appellent le fichier index.js original (que j'ai renommé en appbootstrapper.js):

//index_no_auth.js authentication turned off
const bootstrapper = require('./appbootstrapper');
bootstrapper(false);

//index_auth.js authentication turned on
const bootstrapper = require('./appbootstrapper');
bootstrapper(true);

class AppBootStrapper {

    init(useauth) {
        //real initialization
    }
}

Peut-être que cela peut aider quelqu'un d'autre

{
  ...
  "scripts": {
    "start": "ENV NODE_ENV=production someapp --options"
  }
  ...
}
1
Cailean

Vous ne devez pas définir de variables ENV dans package.json. actionhero utilise NODE_ENV pour vous permettre de modifier les options de configuration qui sont chargées à partir des fichiers de ./config. Découvrez le fichier de configuration redis et voyez comment NODE_ENV est utilisé pour modifier les options de base de données dans NODE_ENV=test

Si vous souhaitez utiliser d'autres variables ENV pour définir des éléments (peut-être le port HTTP), vous n'avez toujours pas besoin de modifier quoi que ce soit dans package.json. Par exemple, si vous définissez PORT=1234 dans ENV et souhaitez l'utiliser comme port HTTP dans NODE_ENV=production, il suffit de référencer cela dans le fichier de configuration approprié, IE:

# in config/servers/web.js
exports.production = { 
  servers: {
    web: function(api){
      return {
       port: process.env.PORT
      }
    }
  }
}
1
Evan

Cela fonctionnera dans la console Windows :

"scripts": {
  "aaa": "set TMP=test && npm run bbb",
  "bbb": "echo %TMP%"
}

npm run aaa

sortie: test

Voir cette réponse pour plus de détails.

1
Sergey