it-swarm.com.de

Befehlszeilenargumente an das npm-Skript senden

Der scripts-Teil meines 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. So weit, ist es gut.

Ich möchte jedoch gerne etwas wie npm start 8080 ausführen und die Argumente an script.js übergeben lassen (z. B. npm start 8080 => node ./script.js server 8080). Ist das möglich?

507
arnemart

Edit 2014.10.30:Args können ab npm 2.0.0 an npm run übergeben werden

Die Syntax lautet wie folgt:

npm run <command> [-- <args>]

Beachten Sie den notwendigen --. Es ist erforderlich, die an npm übergebenen Parameter selbst und die an Ihr Skript übergebenen Parameter zu trennen.

Also, wenn Sie in package.json

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

Dann wären die folgenden Befehle gleichwertig:

grunt task:target => npm run grunt -- task:target

node server.js --port=1337 => npm run server -- --port=1337

Um den Parameterwert zu erhalten, siehe diese Frage . Zum Lesen benannter Parameter ist es wahrscheinlich am besten, eine Parsing-Bibliothek wie yargs oder minimist zu verwenden. nodejs macht process.argv global verfügbar und enthält Befehlszeilenparameterwerte. Dies ist jedoch eine Low-Level-API (durch Leerzeichen getrenntes Array von Zeichenfolgen, wie sie vom Betriebssystem für die ausführbare Knotendatei bereitgestellt wird). 


Edit 2013.10.03: Derzeit ist es nicht direkt möglich. Es gibt jedoch ein ähnliches GitHub-Problem in npm , um das gewünschte Verhalten zu implementieren. Anscheinend besteht der Konsens darin, dass dies umgesetzt wird, aber es hängt von einem anderen Problem ab, das zuvor gelöst wurde.


Ursprüngliche Antwort: Als eine Art Workaround (wenn auch nicht sehr praktisch) können Sie Folgendes tun:

Sagen Sie, Ihr Paketname aus package.json ist myPackage und Sie haben auch

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

Dann fügen Sie in package.json hinzu:

"config": {
    "myPort": "8080"
}

Und in deinem script.js:

// defaulting to 8080 in case if script invoked not via "npm run-script" but directly
var port = process.env.npm_package_config_myPort || 8080

Auf diese Weise verwendet npm start standardmäßig 8080. Sie können es jedoch konfigurieren (der Wert wird von npm in seinem internen Speicher gespeichert):

npm config set myPackage:myPort 9090

Beim Aufruf von npm start wird dann 9090 verwendet (der Standard von package.json wird überschrieben).

736
jakub.g

Sie haben gefragt, ob Sie etwas wienpm start 8080 ausführen können. Dies ist möglich, ohne dass script.js oder Konfigurationsdateien wie folgt geändert werden müssen.

Geben Sie beispielsweise in Ihrem "scripts"-JSON-Wert Folgendes ein:

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

Und dann von der Kommandozeile:

$ PORT=8080 npm start

Ich habe bestätigt, dass dies mit bash und npm 1.4.23 funktioniert. Beachten Sie, dass für diese Problemumgehung keine Lösung von GitHub npm issue # 3494 erforderlich ist.

164
cjerdonek

Sie könnten das auch tun:

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

Update: Unter Verwendung von npm 3.10.3 werden die Variablen process.env.npm_config_? Ich verwende auch better-npm-run, daher bin ich mir nicht sicher, ob dies das Standardverhalten von Vanilla ist oder nicht, aber diese Antwort ist funktioniert. Versuchen Sie statt process.env.npm_config_myVarprocess.env.npm_config_myvar

78
francoisrv

Die Antwort von jakub.g ist korrekt, ein Beispiel mit grunt erscheint jedoch etwas komplex.

Also meine einfachere Antwort:

- Befehlszeilenargument an ein npm-Skript senden

Syntax zum Senden von Befehlszeilenargumenten an ein NPM-Skript:

npm run [command] [-- <args>]

Stellen Sie sich vor, wir haben in unserer package.json eine npm-Startaufgabe, um den webpack dev-Server zu starten:

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

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

Nun, wenn wir einen Port an das npm-Skript übergeben wollen:

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

dies laufen und den Port passieren, z. 5000 via Kommandozeile wäre wie folgt:

npm start --port:5000

- Mit package.json config:

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

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

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

npm start verwendet den in Ihrer Konfiguration angegebenen Port, oder Sie können ihn alternativ überschreiben

npm config set myPackage:myPort 3000

- Einen Parameter in deinem npm-Skript setzen

Ein Beispiel für das Lesen eines Variablensatzes in Ihrem npm-Skript. In diesem Beispiel NODE_ENV

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

lies 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");
}
57
steven iseki

npm 2.x support cli args

Befehl

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

Package.json

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

Index.js

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

31

Verwenden Sie process.argv in Ihrem Code und geben Sie einfach einen nachlaufenden $* für den Eintrag Ihres Scripts-Werts ein.

Versuchen Sie es als Beispiel mit einem einfachen Skript, das nur die angegebenen Argumente protokolliert, um echoargs.js zu standardisieren:

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

package.json:

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

Beispiele:

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

process.argv[0] ist die ausführbare Datei (Knoten), process.argv[1] ist Ihr Skript.

Mit npm v5.3.0 und Knoten v8.4.0 getestet

23
Peter

Wenn Sie Argumente an die Mitte eines npm-Skripts übergeben möchten, anstatt sie 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 das -w-Überwachungsflag an babel, aber npm run start führt nur einmal einen normalen Build aus.

13
Dan Ross

Dies beantwortet Ihre Frage zwar nicht wirklich, Sie können jedoch stattdessen immer Umgebungsvariablen verwenden:

"scripts": {
    "start": "PORT=3000 node server.js"
}

Dann in Ihrer server.js-Datei:

var port = process.env.PORT || 3000;
5
DrunkenBeetle

Soweit ich sehe, verwenden die Leute package.json-Skripts, wenn sie das Skript auf einfachere Weise ausführen möchten. Um nodemon zu verwenden, das in lokalen node_modules installiert ist, können wir nodemon nicht direkt vom cli aus aufrufen, sondern können es mit ./node_modules/nodemon/nodemon.js aufrufen. Um dieses lange Tippen zu vereinfachen, können wir das so formulieren ...

 ...

 Skripte: {
 'start': 'nodemon app.js' 
 } 

 ...

... dann rufen Sie npm start auf, um 'nodemon' zu verwenden, das als erstes Argument app.js enthält.

Was ich versuche zu sagen, wenn Sie Ihren Server nur mit dem Befehl node starten möchten, glaube ich nicht, dass Sie scripts verwenden müssen. Die Eingabe von npm start oder node app.js hat den gleichen Aufwand.

Wenn Sie jedoch nodemon verwenden und ein dynamisches Argument übergeben möchten, verwenden Sie auch script nicht. Verwenden Sie stattdessen Symlink.

Zum Beispiel mit der Migration mit sequelize. Ich erstelle einen Symlink ...

ln -s node_modules/sequelize/bin/sequelize sequelize

... Und ich kann jede Argumentation führen, wenn ich es nenne ...

./sequlize -h /* show help */

./sequelize -m /* upgrade migration */

./sequelize -m -u /* downgrade migration */

usw...

An diesem Punkt ist die Verwendung von Symlink der beste Weg, den ich herausfinden konnte, aber ich denke nicht, dass es die beste Methode ist.

Ich hoffe auch auf deine Meinung zu meiner Antwort.

3
Kiddo

npm run script_target - <argument> Im Grunde ist dies die Art, die Befehlszeilenargumente zu übergeben. Dies funktioniert jedoch nur, wenn bei einem Skript nur ein Befehl ausgeführt wird, als würde ich einen Befehl ausführen, dh npm run start - 4200

"script":{
       "start" : "ng serve --port="
 }

Dies wird für die Übergabe von Befehlszeilenparametern ausgeführt. Was passiert, wenn wir mehr als einen Befehl zusammen ausführen, wie npm? Build c:/workspace/file  

"script":{
       "build" : "copy c:/file <arg> && ng build"
 } 

es wird jedoch so interpretiert, dass copy c:/file && ng build c:/work space/file ausgeführt wird, und wir erwarten so etwas copy c:/file c:/Arbeitsbereich/Datei && ng Build

Hinweis: - Die Befehlszeilenparameter funktionieren nur, wenn nur ein Befehl in einem Skript vorhanden ist.

Ich habe oben einige Antworten gelesen, in denen einige von ihnen schreiben, dass Sie mit dem $ -Symbol auf den Befehlszeilenparameter zugreifen können, aber dies wird nicht funktionieren  

0
Sunny Goel

Ich habe den folgenden Weg benutzt, um einen Test durchzuführen

  "scripts": {  
       "test-one": "mocha --timeout 90000 --watch --require ts-node/register --watch-extensions ts $1"
}

Um den Test auszuführen, wird der folgende Befehl verwendet

npm run test-one ./e2e/<test_file_path>

Ich muss keine Konfiguration dafür verwenden. Ich habe das Gefühl, dass Sie ein Argument genauso führen können, wie ich es hier tue.

0
Kamrul

Ich habe diese Frage gefunden, als ich versuchte, mein Problem mit dem Ausführen von sequelize seed zu lösen: Erzeugen des Befehls cli:

node_modules/.bin/sequelize seed:generate --name=user

Lass mich auf den Punkt kommen. Ich wollte einen kurzen Skriptbefehl in meiner Datei package.json haben und gleichzeitig das Argument --name bereitstellen

Die Antwort kam nach einigen Versuchen. Hier ist mein Befehl in package.json

"scripts: {
  "seed:generate":"NODE_ENV=development node_modules/.bin/sequelize seed:generate"
}

... und hier ist ein Beispiel für die Ausführung im Terminal, um eine Seed-Datei für einen Benutzer zu erstellen

> yarn seed:generate --name=user

> npm run seed:generate -- --name=user

Zu Ihrer Information

yarn -v
1.6.0

npm -v
5.6.0
0
Serge Seletskyy