Wie setze package.json
ich einige Umgebungsvariablen von innen , um sie mit npm start
ähnlichen Befehlen zu verwenden?
Folgendes habe ich derzeit in meinem package.json
:
{
...
"scripts": {
"help": "tagove help",
"start": "tagove start"
}
...
}
Ich möchte Umgebungsvariablen (wie NODE_ENV
) im Startskript festlegen und gleichzeitig die App mit nur einem Befehl starten können npm start
.
node.js
npm
package.json
npm-scripts
dev.meghraj
quelle
quelle
Antworten:
Legen Sie die Umgebungsvariable im Skriptbefehl fest:
Dann verwenden Sie
process.env.NODE_ENV
in Ihrer App.Hinweis:
env
Stellt sicher, dass es plattformübergreifend funktioniert. Sie können es weglassen, wenn Sie sich nur für Mac / Linux interessieren.quelle
set NODE_ENV=test&& mocha --reporter spec
- Zwischen dem Test und && ist absichtlich kein Leerzeichen."test": "NODE_ENV=test mocha --reporter spec"
funktioniert nicht auf Windows-Systemen.env NODE_ENV=test mocha --reporter spec
verwendet die deklarierte Umgebungsvariable nativ plattformübergreifend. Der Schlüssel ist jedoch, dass sie von npm ad hoc und einmalig nur für die Ausführung des npm-Skripts verwendet wird. (Es wird nicht festgelegt oder zur späteren Bezugnahme exportiert.) Solange Sie Ihren Befehl über das npm-Skript ausführen, gibt es kein Problem. Außerdem muss das "&&" entfernt werden, wenn Sie dies auf diese Weise tun.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 gelangen. Sie legen einfach die Umgebung fest und starten dann die nächste Aufgabe. Dank an @mikekidder für den Vorschlag in einem der Kommentare hier.
Aus der Dokumentation:
Beachten Sie, dass Sie, wenn Sie mehrere globale Variablen festlegen möchten, diese nur nacheinander angeben, gefolgt von Ihrem auszuführenden Befehl.
Letztendlich lautet der Befehl, der ausgeführt wird (mit Spawn):
Die
NODE_ENV
Umgebungsvariable wird von cross-env festgelegtquelle
"test": "cross-env TS_NODE_COMPILER_OPTIONS='{\\\"module\\\":\\\"commonjs\\\"}' mocha"
env
oder verwenden sollcross-env
? Einerseits erfordert env nicht, dass ich etwas installiere, und andererseitscross-env
ist es beliebter. Kann jemand bitte bestätigen, obenv
auf allen Plattformen funktioniert?env
funktioniert nicht auf allen Plattformen wie es ist, daher der Grund fürcross-env
die Existenz. Einfach benutzencross-env
und fertig.Ich wollte hier nur meine zwei Cent für zukünftige Node-Entdecker hinzufügen. Auf meinem Ubuntu 14.04
NODE_ENV=test
funktionierte das nicht, ich musste es verwenden,export NODE_ENV=test
danachNODE_ENV=test
fing es auch an zu arbeiten, komisch.Unter Windows müssen Sie, wie bereits gesagt, verwendet werden,
set NODE_ENV=test
aber für eine plattformübergreifende Lösung schien die Cross-Env-Bibliothek nicht den Trick zu tun, und benötigen Sie dazu wirklich eine Bibliothek:Die vertikalen Balken werden benötigt, da Windows sonst bei dem nicht erkannten
export NODE_ENV
Befehl abstürzen würde : D. Keine Ahnung über den nachgestellten Platz, aber nur um sicherzugehen, dass ich sie auch entfernt habe.quelle
&&
?NODE_ENV=test yadda
bedeutet "Ausführenyadda
, FestlegenNODE_ENV
innerhalbyadda
der Umgebungsvariablen.NODE_ENV=test && yadda
Bedeutet" InNODE_ENV
der lokalen Umgebung festlegen , aber nicht exportieren, dann ausführenyadda
". DiesNODE_ENV=test yadda
ist der bevorzugte Ansatz.NODE_ENV=test && npm run test
oder ähnliches. Ich habe eine bessere Lösung mitprocess.env["NODE_ENV"] = "testing";
meiner Datei testhelper.js gefunden.&&
und Ihre Umgebungsvariablen verloren haben, funktioniert das Festlegen von Umgebungsvariablen ohne Export nur mit dem aktuellen Befehl (was nichts ist). Um den Befehl mit der Variablen env auszuführen, ohne u zu exportieren, tun Sie Folgendes :NODE_ENV=test npm run test
. Der Grund, warum es nach dem Export funktioniert hat, ist, dass Ihre Variable jetzt in der Sitzung verfügbar (exportiert) ist und Ihr NODE_ENV ohne Export nichts getan hat.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).Stellen Sie dann
export $(cat .env | xargs) &&
vor Ihrem Skriptbefehl ein.Beispiel:
Für einen Test können Sie die env-Variablen anzeigen, indem Sie
npm run env
(Linux) odernpm run env-windows
(Windows) ausführen .quelle
&&
es funktioniert. - Wenn Sie mehrere .env-Dateien haben, ist es möglicherweise etwas schwieriger, diese zu pflegen. Ihre Antwort hat mich dazu inspiriert, diesen Vorschlag vorzubereiten: stackoverflow.com/questions/25112510/…Versuchen Sie dies unter Windows, indem Sie Folgendes ersetzen
YOURENV
:quelle
Plötzlich stellte ich fest, dass actionhero folgenden Code verwendet, der mein Problem löste, indem er einfach die Befehlsoption
--NODE_ENV=production
start script übergab .Ich würde es wirklich begrüßen, die Antwort von jemand anderem zu akzeptieren, der besser weiß, wie Umgebungsvariablen in package.json oder im Init-Skript oder so etwas gesetzt werden können, wenn die App von jemand anderem gebootet wird.
quelle
Für einen größeren Satz von Umgebungsvariablen oder wenn Sie sie wiederverwenden möchten, können Sie verwenden
env-cmd
../.env
Datei:./package.json
::quelle
process.env.ENV1
mongod --dbpath ~/data/db
. Ich möchte so etwas ausführennpm mongodb
und das wird die Umgebungsvariable dbpath erhalten und die Mondodb wie immer ausführen ... und ... ich möchte es mit anderen Mitgliedern teilen.Obwohl ich die Frage nicht direkt beantworte, möchte ich eine Idee zusätzlich zu den anderen Antworten teilen. Von dem, was ich bekommen habe, würde jedes dieser Elemente 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 (für Entwicklungszwecke) gesichert werden soll oder nicht.
Nachdem ich die Antworten gelesen hatte, entschied ich mich einfach, zwei verschiedene Dateien mit aktivierter bzw. deaktivierter Authentifizierung zu erstellen.
Die Dateien sind einfach Wrapper, die die ursprüngliche Datei index.js aufrufen (in die ich umbenannt habe
appbootstrapper.js
):Vielleicht kann das jemand anderem helfen
quelle
quelle
Dies funktioniert in der Windows-Konsole :
npm run aaa
Ausgabe:
test
Siehe diese Antwort für Details.
quelle
set TMP=test&& npm run bbb
. Das Leerzeichen vor&&
wird auch als Teil der damaligenNODE_ENV
Zeichenfolge"
.Sie sollten keine ENV-Variablen in setzen
package.json
. Mit actionheroNODE_ENV
können Sie Konfigurationsoptionen ändern, die aus den Dateien in geladen werden./config
. Überprüfen Sie die Redis-Konfigurationsdatei und sehen Sie, wie NODE_ENV zum Ändern der Datenbankoptionen in verwendet wirdNODE_ENV=test
Wenn Sie andere ENV-Variablen verwenden möchten, um Dinge festzulegen (möglicherweise den HTTP-Port), müssen Sie immer noch nichts ändern
package.json
. Wenn Sie beispielsweisePORT=1234
in ENV festlegen und dies als HTTP-Port in verwenden möchtenNODE_ENV=production
, verweisen Sie einfach auf das in der entsprechenden Konfigurationsdatei, IE:quelle
npm start
Befehl. Wenn Sie mit dem obigen Snippet Ihren Server über den ENV-Port ausführen möchten, ist dies :export PORT=1234; npm start
. Sie können beliebig viele ENV-Deklarationen anhängen, diese gehören jedoch nicht in die Datei package.json. Wenn Sie sich Sorgen machen möchten, dass sie vorhanden sind, sollten Sie die Standardeinstellungen in Ihrer Konfigurationsdatei verwenden :port: process.env.PORT || 8080
.NODE_ENV=test npm start
oder sie von der Shell festlegen lassennpm (und Garn) übergibt viele Daten aus package.json als Umgebungsvariablen an Skripte. Verwenden Sie
npm run env
, um sie alle zu sehen. Dies ist in https://docs.npmjs.com/misc/scripts#environment dokumentiert und gilt nicht nur für "Lifecycle" -Skripte wie,prepublish
sondern auch für alle vonnpm run
.Sie können auf diesen internen Code zugreifen (z. B.
process.env.npm_package_config_port
in JS), aber sie stehen der Shell, in der die Skripte ausgeführt werden, bereits zur Verfügung, sodass Sie auch als$npm_...
Erweiterungen in den "Skripten" darauf zugreifen können (Unix-Syntax funktioniert unter Windows möglicherweise nicht?).Der Abschnitt "config" scheint für diese Verwendung vorgesehen zu sein:
Eine wichtige Eigenschaft dieser "Konfigurations" -Felder ist, dass Benutzer sie überschreiben können, ohne package.json zu ändern !
Siehe npm config und yarn config docs.
Es scheint , dass Garn liest
~/.npmrc
sonpm config set
beide betrifft, sondernyarn config set
schreibt~/.yarnrc
, so dass nur Garn es sieht :-(quelle
@ lukes Antwort war fast die, die ich brauchte! Vielen Dank.
Da die ausgewählte Antwort sehr einfach (und korrekt), aber alt ist, möchte ich eine Alternative zum Importieren von Variablen aus einer separaten .env-Datei anbieten, wenn Sie Ihre Skripte ausführen und einige Einschränkungen für Lukes Antwort beheben. Versuche dies:
::: .env Datei :::
Anschließend erstellen Sie in Ihrem Paket json ein Skript, mit dem die Variablen festgelegt und vor den Skripten ausgeführt werden, die Sie benötigen:
::: package.json :::
Einige Beobachtungen:
Der reguläre Ausdruck im Befehl grep'ed cat löscht die Kommentare und Leerzeilen.
Das
&&
nicht sein muß „kleben“ zunpm run set-env
, wie es erforderlich wäre , wenn Sie die Variablen in dem gleichen Befehl wurden Einstellung.Wenn Sie Garn verwenden, wird möglicherweise eine Warnung angezeigt. Sie können diese entweder ändern
yarn set-env
odernpm run set-env --scripts-prepend-node-path &&
stattdessen verwenden.Unterschiedliche Umgebungen
Ein weiterer Vorteil bei der Verwendung ist, dass Sie verschiedene Umgebungsvariablen haben können.
quelle
Verwenden Sie Git Bash in Windows. Git Bash verarbeitet Befehle anders als cmd.
Die meisten Windows-Eingabeaufforderungen werden erstickt, wenn Sie Umgebungsvariablen mit NODE_ENV = Produktion so festlegen. (Die Ausnahme ist Bash unter Windows, das natives Bash verwendet.) Ebenso gibt es einen Unterschied darin, wie Windows- und POSIX-Befehle Umgebungsvariablen verwenden. Unter POSIX verwenden Sie: $ ENV_VAR und unter Windows% ENV_VAR%. - cross-env doc
Verwenden Sie das Paket dotenv, um die env-Variablen zu deklarieren
quelle