web-dev-qa-db-ger.com

Festlegen von Umgebungsvariablen in package.json

Wie setze ich einige Umgebungsvariablen innerhalb von package.json, die mit npm start ähnlichen Befehlen verwendet werden sollen?

Folgendes habe ich aktuell in meinem package.json:

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

Ich möchte Umgebungsvariablen (wie NODE_ENV) im Startskript festlegen, während ich die App mit nur einem Befehl, npm start, starten kann.

232
dev.meghraj

Legen Sie die Umgebungsvariable im Skriptbefehl fest:

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

Verwenden Sie dann process.env.NODE_ENV in Ihrer App.

Hinweis: Dies ist für nur Mac & Linux. Für Windows beziehen Sie sich auf die Kommentare.

316
cesar

Verwenden Sie einfach das NPM-Paket cross-env . Super einfach. Funktioniert unter Windows, Linux und allen Umgebungen. Beachten Sie, dass Sie && nicht verwenden, um zur nächsten Aufgabe zu wechseln. Sie stellen einfach die Umgebung ein und starten dann die nächste Aufgabe. Dank an @ mikekidder für den Vorschlag in einer der Kommentare hier.

Aus der Dokumentation:

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

Beachten Sie, dass Sie, wenn Sie mehrere globale Variablen festlegen möchten, diese einfach nacheinander angeben und anschließend Ihren auszuführenden Befehl eingeben.

Letztendlich lautet der Befehl, der ausgeführt wird (mit spawn):

webpack --config build/webpack.config.js

Die Umgebungsvariable NODE_ENV wird durch cross-env gesetzt

182
TetraDev

Ich wollte hier nur meine zwei Cent für zukünftige Node-Entdecker hinzufügen. Auf meinem Ubuntu 14.04 funktionierte der NODE_ENV=test nicht, ich musste export NODE_ENV=test verwenden, woraufhin NODE_ENV=test auch anfing zu arbeiten, komisch.

Wie bereits erwähnt, müssen Sie unter Windows set NODE_ENV=test verwenden, aber für eine plattformübergreifende Lösung hat die Cross-Env-Bibliothek anscheinend nicht den Trick getan, und benötigen Sie wirklich eine Bibliothek, um dies zu tun:

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

Die vertikalen Balken werden benötigt, da Windows sonst bei dem nicht erkannten Befehl export NODE_ENV abstürzen würde: D. Keine Ahnung von dem nachgestellten Platz, aber nur um sicherzugehen, dass ich sie auch entfernt habe.

34
TeemuK

Da ich häufig mit mehreren Umgebungsvariablen arbeite, finde ich es nützlich, sie in einer separaten .env -Datei zu speichern (ignorieren Sie dies in Ihrer Quellcodeverwaltung).

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

Stellen Sie dann export $(cat .env | xargs) && vor Ihren Skriptbefehl.

Beispiel:

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

Für einen Test können Sie die env-Variablen anzeigen, indem Sie npm run env (Linux) oder npm run env-windows (Windows) ausführen.

10
Luke

plötzlich stellte ich fest, dass actionhero den folgenden Code verwendet, der mein Problem löste, indem er nur --NODE_ENV=production in der Startskript-Befehlsoption übergab.

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

ich würde wirklich gerne die Antwort von jemand anderem annehmen, der besser weiß, wie Umgebungsvariablen in package.json oder im Init-Skript oder so ähnlich gesetzt werden können, wenn die App von jemand anderem gebootet wurde.

7
dev.meghraj

Versuchen Sie dies unter Windows, indem Sie YOURENV ersetzen:

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

Für einen größeren Satz von Umgebungsvariablen oder wenn Sie diese wiederverwenden möchten, können Sie env-cmd verwenden.

_./.env_ Datei:

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

Obwohl ich die Frage nicht direkt beantworte, möchte ich eine Idee zusätzlich zu den anderen Antworten teilen. Von all dem, was ich bekommen habe, würde jedes ein gewisses Maß an Komplexität bieten, um plattformübergreifende Unabhängigkeit zu erreichen.

In meinem Szenario wollte ich ursprünglich nur eine Variable festlegen, um zu steuern, ob der Server mit JWT-Authentifizierung gesichert werden soll oder nicht (zu Entwicklungszwecken).

Nachdem ich die Antworten gelesen hatte, entschloss ich mich einfach, zwei verschiedene Dateien mit aktivierter bzw. deaktivierter Authentifizierung zu erstellen.

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

Die Dateien sind einfach Wrapper, die die ursprüngliche Datei index.js aufrufen (die ich in appbootstrapper.js umbenannt habe):

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

Vielleicht kann das jemand anderem helfen

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

Sie sollten in package.json keine ENV-Variablen setzen. actionhero verwendet NODE_ENV, um Konfigurationsoptionen zu ändern, die aus den Dateien in ./config geladen werden. Schauen Sie sich die redis config file an und sehen Sie, wie NODE_ENV verwendet wird, um Datenbankoptionen in NODE_ENV=test zu ändern.

Wenn Sie andere ENV-Variablen zum Festlegen von Dingen verwenden möchten (möglicherweise den HTTP-Port), müssen Sie in package.json noch nichts ändern. Wenn Sie beispielsweise PORT=1234 in ENV festlegen und diesen als HTTP-Port in NODE_ENV=production verwenden möchten, verweisen Sie einfach auf diesen in der entsprechenden Konfigurationsdatei, IE:

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

Dies funktioniert in der Windows-Konsole :

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

npm run aaa

ausgabe: test

Siehe diese Antwort für Details.

1
Sergey