1462 Stimmen

Senden von Befehlszeilenargumenten an das npm-Skript

Der scripts-Teil meiner package.json sieht derzeit so aus:

"scripts": {
    "start": "node ./script.js server"
}

...was bedeutet, dass ich npm start ausführen kann, um den Server zu starten. Bisher so gut.

Ich möchte jedoch in der Lage sein, so etwas wie npm start 8080 auszuführen und die Argumente an script.js übergeben zu haben (z.B. npm start 8080 => node ./script.js server 8080). Ist das möglich?

1975voto

jakub.g Punkte 33857

Npm 2 und neuer

Es ist möglich, Argumente an npm run zu übergeben seit npm 2 (2014). Die Syntax ist wie folgt:

npm run [-- ]

Beachten Sie den -- Separator, der verwendet wird, um die an den npm Befehl selbst übergebenen Parameter von den an Ihr Skript übergebenen Parametern zu trennen.

Mit dem Beispiel package.json:

"scripts": {
    "grunt": "grunt",
    "server": "node server.js"
}

so übergeben Sie die Parameter an diese Skripte:

npm run grunt -- task:target  // ruft `grunt task:target` auf
npm run server -- --port=1337 // ruft `node server.js --port=1337` auf

Hinweis: Wenn Ihr Parameter nicht mit - oder -- beginnt, ist ein expliziter -- Separator nicht erforderlich, aber es ist besser, ihn zur Klarheit dennoch zu verwenden.

npm run grunt task:target     // ruft `grunt task:target` auf

Beachten Sie den Unterschied im Verhalten unten (test.js hat console.log(process.argv)): Die Parameter, die mit - oder -- beginnen, werden an npm übergeben und nicht an das Skript und werden dort stillschweigend geschluckt.

$ npm run test foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js', 'foobar']

$ npm run test -foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js']

$ npm run test --foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js']

$ npm run test -- foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js', 'foobar']

$ npm run test -- -foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js', '-foobar']

$ npm run test -- --foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js', '--foobar']

Der Unterschied wird deutlicher, wenn Sie einen Parameter verwenden, der tatsächlich von npm verwendet wird:

$ npm test --help      // das ist ein getarntes `npm --help test`
npm test [-- ]

aliases: tst, t

Um den Parameterwert zu erhalten, sehen Sie diese Frage. Zum Lesen benannter Parameter ist es wahrscheinlich am besten, eine Parsing-Bibliothek wie yargs oder minimist zu verwenden; nodejs stellt process.argv global zur Verfügung, das die Werte der Befehlszeilenparameter enthält, aber dies ist eine Low-Level-API (Leerzeichen-getrenntes Array von Zeichenfolgen, wie es vom Betriebssystem an das Node-Programm übergeben wird).

353voto

cjerdonek Punkte 5154

Sie haben darum gebeten, etwas ähnliches wie npm start 8080 ausführen zu können. Dies ist möglich, ohne script.js oder Konfigurationsdateien ändern zu müssen, wie folgt:

Zum Beispiel, nehmen Sie in Ihrem JSON-Wert "scripts" Folgendes auf--

"start": "node ./script.js server $PORT" 

Und dann von der Befehlszeile aus:

$ PORT=8080 npm start 

Ich habe bestätigt, dass dies mit bash und npm 1.4.23 funktioniert. Beachten Sie, dass dieses Work-around nicht erfordert, dass das GitHub npm Problem #3494 gelöst wird.

144voto

francoisrv Punkte 2287

Sie könnten das auch machen:

In package.json:

"scripts": {
    "cool": "./cool.js"
}

In cool.js:

 console.log({ myVar: process.env.npm_config_myVar });

In CLI:

npm --myVar=something run-script cool

Sollte ausgeben:

{ myVar: 'something' }

Aktualisierung: Verwenden von npm 3.10.3, anscheinend werden die process.env.npm_config_ Variablen in Kleinbuchstaben umgewandelt? Ich verwende auch better-npm-run, daher bin ich mir nicht sicher, ob dies das Standardverhalten ist oder nicht, aber diese Antwort funktioniert. Anstelle von process.env.npm_config_myVar versuchen Sie process.env.npm_config_myvar

115voto

Andrew Odri Punkte 7660

Ich hatte diese Einzeiler früher verwendet und musste kürzlich versuchen, sie wiederzuentdecken, nachdem ich eine Weile weg von Node.js war. Ähnlich wie die Lösung, die von @francoisrv erwähnt wurde, verwendet sie die npm_config_* Variablen.

Erstellen Sie die folgende minimale package.json Datei:

{
  "name": "argument",
  "version": "1.0.0",
  "scripts": {
    "argument": "echo \"Der Wert von --foo ist '${npm_config_foo}'\""
  }
}

Führen Sie den folgenden Befehl aus:

npm run argument --foo=bar

Beobachten Sie die folgende Ausgabe:

Der Wert von --foo ist 'bar'

All dies ist schön dokumentiert in der offiziellen npm-Dokumentation:

Hinweis: Der Abschnitt Umgebungsvariablen erklärt, dass Variablen innerhalb von Skripts sich anders verhalten als in der Dokumentation definiert ist. Dies gilt, wenn es um die Groß- und Kleinschreibung geht, sowie darum, ob das Argument mit einem Leerzeichen oder Gleichheitszeichen definiert ist.

Hinweis: Wenn Sie ein Argument mit Bindestrichen verwenden, werden diese durch Unterstriche in der entsprechenden Umgebungsvariable ersetzt. Zum Beispiel würde npm run example --foo-bar=baz der Umgebungsvariable ${npm_config_foo_bar} entsprechen.

Hinweis: Für Windows-Benutzer ohne WSL siehe @Doctor Blue's Kommentare unten... TL;DR ersetzen Sie ${npm_config_foo} durch %npm_config_foo%.

105voto

svnm Punkte 19899

jakub.g's Antwort ist korrekt, jedoch erscheint ein Beispiel mit Grunt etwas komplex.

Also meine einfachere Antwort:

- Übermitteln eines Befehlszeilenarguments an ein npm-Skript

Syntax zum Übermitteln von Befehlszeilenargumenten an ein npm-Skript:

npm run [Befehl] [-- ]

Stellen wir uns vor, wir haben eine npm start-Aufgabe in unserer package.json, um den Webpack Dev Server zu starten:

"scripts": {
  "start": "webpack-dev-server --port 5000"
},

Wir führen dies von der Befehlszeile aus mit npm start aus

Jetzt, wenn wir einen Port an das npm-Skript übergeben möchten:

"scripts": {
  "start": "webpack-dev-server --port process.env.port || 8080"
},

Dies auszuführen und den Port z.B. 5000 über die Befehlszeile zu übergeben, würde wie folgt aussehen:

npm start --port:5000

- Verwendung der package.json-Konfiguration:

Wie von jakub.g erwähnt, können Sie alternativ Parameter in der Konfiguration Ihrer package.json festlegen

"config": {
  "myPort": "5000"
}

"scripts": {
  "start": "webpack-dev-server --port process.env.npm_package_config_myPort || 8080"
},

npm start wird den im Konfigurationsabschnitt festgelegten Port verwenden, oder alternativ können Sie diesen überschreiben

npm config set myPackage:myPort 3000

- Festlegen eines Parameters in Ihrem npm-Skript

Ein Beispiel zum Lesen einer in Ihrem npm-Skript festgelegten Variable. In diesem Beispiel NODE_ENV

"scripts": {
  "start:prod": "NODE_ENV=prod node server.js",
  "start:dev": "NODE_ENV=dev node server.js"
},

lesen Sie NODE_ENV in server.js entweder prod oder dev

var env = process.env.NODE_ENV || 'prod'

if(env === 'dev'){
    var app = require("./serverDev.js");
} else {
    var app = require("./serverProd.js");
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X