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.
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.
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
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.
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.
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.
Versuchen Sie dies unter Windows, indem Sie YOURENV
ersetzen:
{
...
"scripts": {
"help": "set NODE_ENV=YOURENV&& tagove help",
"start": "set NODE_ENV=YOURENV&& tagove start"
}
...
}
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"
}
}
_
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"
}
...
}
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
}
}
}
}
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.