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
.
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.
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
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.
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).
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.
Essayez ceci sous Windows en remplaçant YOURENV
:
{
...
"scripts": {
"help": "set NODE_ENV=YOURENV&& tagove help",
"start": "set NODE_ENV=YOURENV&& tagove start"
}
...
}
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"
}
}
_
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"
}
...
}
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
}
}
}
}
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.