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?

98voto

Gregory Houllier Punkte 1247

Ab npm 2.x können Sie Argumente in Ausführungsskripten übergeben, indem Sie sie mit -- separieren

Terminal

npm run-script start -- --foo=3

Package.json

"start": "node ./index.js"

Index.js

console.log('process.argv', process.argv);

54voto

Peter Punkte 1207

Verwenden Sie process.argv in Ihrem Code und fügen Sie einfach eine abschließende $* zum Wert ihres Skripts hinzu.

Versuchen Sie es als Beispiel mit einem einfachen Skript, das die bereitgestellten Argumente einfach in die Standardausgabe protokolliert echoargs.js:

console.log('Argumente: ' + process.argv.slice(2));

package.json:

"scripts": {
    "start": "node echoargs.js $*"
}

Beispiele:

> npm start 1 2 3
Argumente: 1,2,3

process.argv[0] ist das ausführbare Programm (node), process.argv[1] ist Ihr Skript.

Getestet mit npm v5.3.0 und node v8.4.0

39voto

Alexandr Priezzhev Punkte 1333

Die meisten der oben genannten Antworten behandeln lediglich das Weiterleiten der Argumente an Ihr NodeJS-Skript, das von npm aufgerufen wird. Meine Lösung ist für den allgemeinen Gebrauch gedacht.

Verpacken Sie einfach das npm-Skript mit einem Shell-Interpreter (z. B. sh) und übergeben Sie die Argumente wie gewohnt. Die einzige Ausnahme ist, dass die Nummer des ersten Arguments 0 ist.

Zum Beispiel möchten Sie das npm-Skript someprogram --env= hinzufügen, wobei someprogram lediglich den Wert des env-Arguments ausgibt:

package.json

"scripts": {
  "command": "sh -c 'someprogram --env=$0'"
}

Wenn Sie es ausführen:

% npm run -s command my-environment
my-environment

34voto

mxt3 Punkte 311

Für PowerShell-Anwender unter Windows

Die akzeptierte Antwort hat mit npm 6.14 bei mir nicht funktioniert. Weder das Hinzufügen von -- noch das einmalige Einbeziehen funktioniert. Wenn jedoch -- zweimal oder "--" einmal vor den Argumenten platziert wird, funktioniert es. Beispiel:

npm run  -- -- 

Vermuteter Grund

Ähnlich wie in Bash weist -- PowerShell an, alle folgenden Argumente als Literalzeichenfolgen zu behandeln und nicht als Optionen (Zum Beispiel siehe diese Antwort). Anscheinend wird der Befehl jedoch ein Mal öfter interpretiert als erwartet, wodurch das '--' verloren geht. Wenn man zum Beispiel Folgendes ausführt:

npm run  -- --option value

wird npm folgendes ausführen:

 value

Wenn man jedoch Folgendes ausführt:

npm run  "--" --option value

ergibt das:

 "--option" "value"

was gut funktioniert.

26voto

Dan Ross Punkte 3446

Wenn Sie Argumente an die Mitte eines npm-Skripts übergeben möchten, anstatt sie einfach am Ende anzuhängen, scheinen Inline-Umgebungsvariablen gut zu funktionieren:

"scripts": {
  "dev": "BABEL_ARGS=-w npm run build && cd lib/server && nodemon index.js",
  "start": "npm run build && node lib/server/index.js",
  "build": "mkdir -p lib && babel $BABEL_ARGS -s inline --stage 0 src -d lib",
},

Hier übergibt npm run dev die -w -Watch-Flag an Babel, aber npm run start führt einfach einmal einen regulären Build aus.

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