Edit 2014.10.30: Es ist möglich, Argumente ab npm 2.0.0 zu übergebennpm run
Die Syntax lautet wie folgt:
npm run <command> [-- <args>]
Beachten Sie die notwendigen --
. Es ist erforderlich, die an den npm
Befehl selbst übergebenen Parameter und die an Ihr Skript übergebenen Parameter zu trennen .
Also, wenn Sie in haben package.json
"scripts": {
"grunt": "grunt",
"server": "node server.js"
}
Dann wären die folgenden Befehle äquivalent:
grunt task:target
=> npm run grunt -- task:target
node server.js --port=1337
=> npm run server -- --port=1337
Informationen zum Abrufen des Parameterwerts finden Sie in dieser Frage . Zum Lesen benannter Parameter ist es wahrscheinlich am besten, eine Analysebibliothek wie yargs oder minimist zu verwenden . nodejs macht process.argv
global verfügbar und enthält Befehlszeilenparameterwerte. Dies ist jedoch eine API auf niedriger Ebene (durch Leerzeichen getrenntes Array von Zeichenfolgen, wie vom Betriebssystem für die ausführbare Datei des Knotens bereitgestellt).
Edit 2013.10.03: Es ist derzeit nicht direkt möglich. Es wurde jedoch ein verwandtes GitHub-Problem geöffnetnpm
, um das gewünschte Verhalten zu implementieren. Es scheint, dass der Konsens darin besteht, dies umzusetzen, aber es hängt davon ab, ob ein anderes Problem zuvor gelöst wurde.
Ursprüngliche Antwort: Als eine Art Problemumgehung (obwohl nicht sehr praktisch) können Sie Folgendes tun:
Sagen Sie Ihren Paketnamen von package.json
ist myPackage
und Sie haben auch
"scripts": {
"start": "node ./script.js server"
}
Dann fügen Sie hinzu package.json
:
"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 wird standardmäßig npm start
8080 verwendet. Sie können es jedoch konfigurieren (der Wert wird von npm
in seinem internen Speicher gespeichert ):
npm config set myPackage:myPort 9090
Beim Aufrufen npm start
wird dann 9090 verwendet (der Standardwert von package.json
wird überschrieben).
yargs
; Alle Parameter nach dem--
können in Ihrem Skript perfekt analysiert werden.-- --args
holy crap , das ist komisch , aber in OrdnungSie werden gefragt, um etwas laufen wie
npm start 8080
. Dies ist möglich, ohne dassscript.js
Dateien wie folgt geändert oder konfiguriert werden müssen."scripts"
Schließen Sie beispielsweise in Ihrem JSON-Wert Folgendes ein:Und dann von der Kommandozeile:
Ich habe bestätigt, dass dies mit bash und npm 1.4.23 funktioniert. Beachten Sie, dass für diese Problemumgehung das GitHub npm- Problem Nr. 3494 nicht behoben werden muss.
quelle
node ./script.js server ${PORT:-8080}
es auch optional machen.NODE_PORT=${PORT=8080}
funktioniert (notive das gleiche) aber nicht die: - Syntaxnode ./script.js server %PORT%
. Erwägen Sie die Verwendung von cross-var und cross-env .Sie könnten das auch tun:
In
package.json
:In
cool.js
:In der CLI:
Sollte ausgeben:
Update: Mit npm 3.10.3 scheint es, dass die
process.env.npm_config_
Variablen in Kleinbuchstaben geschrieben werden? Ich bin auch mitbetter-npm-run
, so dass ich nicht sicher bin , ob die Vanille-Standardverhalten ist oder nicht, aber diese Antwort ist zu arbeiten.process.env.npm_config_myVar
Versuchen Sie es stattdessenprocess.env.npm_config_myvar
quelle
process.env.npm_config_myVar
gibt true zurück, nicht den Wert.Die Antwort von jakub.g ist richtig, ein Beispiel mit Grunzen scheint jedoch etwas komplex.
Also meine einfachere Antwort:
- Senden eines Befehlszeilenarguments an ein npm-Skript
Syntax zum Senden von Befehlszeilenargumenten an ein npm-Skript:
Stellen Sie sich vor, wir haben eine npm-Startaufgabe in unserer package.json, um den Webpack-Entwicklungsserver zu starten:
Wir führen dies von der Kommandozeile aus mit
npm start
Wenn wir nun einen Port an das npm-Skript übergeben möchten:
Dies auszuführen und den Port zB 5000 über die Befehlszeile zu übergeben, wäre wie folgt:
- Verwenden von package.json config:
Wie von jakub.g erwähnt , können Sie alternativ Parameter in der Konfiguration Ihrer package.json festlegen
npm start
verwendet den in Ihrer Konfiguration angegebenen Port, oder Sie können ihn alternativ überschreiben- Festlegen eines Parameters in Ihrem npm-Skript
Ein Beispiel für das Lesen eines Variablensatzes in Ihrem npm-Skript. In diesem Beispiel
NODE_ENV
Lesen Sie NODE_ENV in server.js entweder prod oder dev
quelle
"start:prod": "NODE_ENV=prod node server.js"
inpackage.json
unter Windows nicht funktioniert, es sei denn, Sie verwenden cross-env"start": "webpack-dev-server --port process.env.npm_package_config_myPort || 8080" },
Sollte"start": "webpack-dev-server --port $npm_package_config_myPort || 8080" },
gemäß meiner Verwendung in diesem Tutorial erklärt werden . Der Prozess ref kann anscheinend innerhalb des Javascript verwendet werden.npm 2.x unterstützt cli args
Befehl
npm run-script start -- --foo=3
Package.json
"start": "node ./index.js"
Index.js
console.log('process.argv', process.argv);
quelle
Verwenden Sie es
process.argv
in Ihrem Code und geben Sie dann nur einen Trailing$*
für die Eingabe Ihres Skriptwerts ein.Versuchen Sie es beispielsweise mit einem einfachen Skript, das nur die angegebenen Argumente als Standard protokolliert
echoargs.js
:package.json:
Beispiele:
process.argv[0]
ist die ausführbare Datei (Knoten),process.argv[1]
ist Ihr Skript.Getestet mit npm v5.3.0 und Node v8.4.0
quelle
--
zu Argumenten, z. B. -npm run demo.js --skip
es funktioniert, wenn ein zusätzliches hinzugefügt wird--
, z. B.npm run demo.js -- --skip
echoargs.js
Skriptdatei zu haben?adb
dem eine.db
Datei an den Android-Emulator gesendet wird, und akzeptiert einen Parameter für den lokalen Pfad der.db
Datei, der an diese gesendet werden soll. Dies ist der erste Parameter vonadb push
. So etwas in der Art:"db:push": "adb push process.argv.slice(2) /data/data/com.cntral.app/databases/database.db"
und ich möchte es mit nennennpm run db:push /Users/joshuapinter/Downloads/updated.db
. Irgendwelche Gedanken?Wenn Sie Argumente an die Mitte eines npm-Skripts übergeben möchten, anstatt sie nur an das Ende anzuhängen, scheinen Inline-Umgebungsvariablen gut zu funktionieren:
Hier wird
npm run dev
die-w
Watch-Flagge an babel übergeben, abernpm run start
nur einmal ein regulärer Build ausgeführt.quelle
npm run dev
,npm start
Ich hatte diesen Einzeiler in der Vergangenheit verwendet und musste nach einiger Zeit von Node.js versuchen, ihn kürzlich wiederzuentdecken. Ähnlich wie bei der von @francoisrv erwähnten Lösung werden die
node_config_*
Variablen verwendet.Erstellen Sie die folgende minimale
package.json
Datei:Führen Sie den folgenden Befehl aus:
Beachten Sie die folgende Ausgabe:
All dies ist in der offiziellen Dokumentation von npm gut dokumentiert:
Hinweis: In der Überschrift Umgebungsvariablen wird erläutert, dass sich Variablen in Skripten anders verhalten als in der Dokumentation definiert. Dies gilt auch für die Groß- und Kleinschreibung , unabhängig davon, ob das Argument mit einem Leerzeichen oder einem Gleichheitszeichen definiert ist .
Hinweis: Wenn Sie ein Argument mit Bindestrichen verwenden, werden diese in der entsprechenden Umgebungsvariablen durch Unterstriche ersetzt. Zum Beispiel
npm run example --foo-bar=baz
würde entsprechen${npm_config_foo_bar}
.Hinweis: Für Nicht-WSL Windows - Benutzer finden @Doctor Blau Kommentare unten ... TL; DR ersetzen
${npm_config_foo}
mit%npm_config_foo%
.quelle
npm run argument --foo=bar
) getan , aber die Variable wird nicht ersetzt :"The value of --foo is '${npm_config_foo}'"
. Wird unter Windows 10 ausgeführt, wenn dies wichtig ist, mit Version 6.9.0 von NPM.%npm_config_foo%
stattdessen verwenden. Reine Windows-Befehlszeile / Powershell hier. (Sie haben auch keine Wahl.)Dies beantwortet Ihre Frage nicht wirklich, aber Sie können stattdessen immer Umgebungsvariablen verwenden:
Dann in Ihrer server.js-Datei:
quelle
Die meisten der obigen Antworten beziehen sich nur auf die Übergabe der Argumente an Ihr NodeJS-Skript, das von npm aufgerufen wird. Meine Lösung ist für den allgemeinen Gebrauch.
Umschließen Sie das npm-Skript einfach mit einem Shell-Interpreter-
sh
Aufruf (z. B. ) und übergeben Sie die Argumente wie gewohnt. Die einzige Ausnahme ist, dass die erste Argumentnummer lautet0
.Sie möchten beispielsweise das npm-Skript hinzufügen
someprogram --env=<argument_1>
, in demsomeprogram
nur der Wert desenv
Arguments gedruckt wird :package.json
Wenn Sie es ausführen:
quelle
Soweit ich weiß, verwenden Benutzer package.json-Skripte, wenn sie Skripte auf einfachere Weise ausführen möchten. Um beispielsweise
nodemon
das in lokalen node_modules installierte zu verwenden, können wir nichtnodemon
direkt von der CLI aus aufrufen , aber wir können es mit verwenden./node_modules/nodemon/nodemon.js
. Um diese lange Eingabe zu vereinfachen, können wir dies ...... rufen Sie dann
npm start
auf, um 'nodemon' zu verwenden, dessen erstes Argument app.js ist.Was ich damit sagen möchte, wenn Sie Ihren Server nur mit dem
node
Befehl starten möchten , müssen Sie ihn meiner Meinung nach nicht verwendenscripts
. Tippennpm start
odernode app.js
hat den gleichen Aufwand.Wenn Sie jedoch
nodemon
ein dynamisches Argument verwenden und übergeben möchten, verwenden Sie es auch nichtscript
. Versuchen Sie stattdessen, symlink zu verwenden.Zum Beispiel mit Migration mit
sequelize
. Ich erstelle einen Symlink ...ln -s node_modules/sequelize/bin/sequelize sequelize
... und ich kann jede Argumentation bestehen, wenn ich es nenne ...
usw...
An diesem Punkt ist die Verwendung von Symlink der beste Weg, den ich herausfinden könnte, aber ich denke nicht wirklich, dass dies die beste Vorgehensweise ist.
Ich hoffe auch auf Ihre Meinung zu meiner Antwort.
quelle
Hinweis: Dieser Ansatz ändert Ihre Einstellungen im laufenden Betrieb.
package.json
Verwenden Sie ihn, wenn Sie keine Alternative haben.Ich musste Befehlszeilenargumente an meine Skripte übergeben, die ungefähr so aussahen:
Das heißt, ich starte meine App mit
npm run start
.Wenn ich nun einige Argumente übergeben möchte, würde ich vielleicht mit Folgendem beginnen:
Dies bedeutet :
npm run build && npm run watch -- --config=someConfig
. Das Problem dabei ist, dass die Argumente immer an das Ende des Skripts angehängt werden. Dies bedeutet, dass alle verketteten Skripte diese Argumente nicht erhalten (Argumente werden möglicherweise von allen benötigt oder nicht, aber das ist eine andere Geschichte.). Wenn die verknüpften Skripte aufgerufen werden, erhalten diese Skripte nicht die übergebenen Argumente. dh Daswatch
Skript erhält die übergebenen Argumente nicht.Die Produktionsnutzung meiner App ist wie folgt: Das
.exe
Übergeben der Argumente in der Exe funktioniert also einwandfrei, aber wenn Sie dies während der Entwicklung tun möchten, wird es problematisch.Ich konnte keinen richtigen Weg finden, um dies zu erreichen, also habe ich es versucht.
Ich habe eine Javascript-Datei erstellt:
start-script.js
Auf der übergeordneten Ebene der Anwendung habe ich eine "default.package.json" und anstelle von "package.json" die Datei "default.package.json". Der Zweck vonstart-script.json
besteht darindefault.package.json
, die übergebenen Argumente zu lesen , zu extrahierenscripts
und zu suchen undnpm run scriptname
dann an diese Skripte anzuhängen. Danach wird eine neue erstelltpackage.json
und die Daten aus default.package.json mit geänderten Skripten kopiert und dann aufgerufennpm run start
.Anstatt es zu tun
npm run start
, tue ich es jetztnode start-script.js --c=somethis --r=somethingElse
Der erste Lauf sieht gut aus, wurde aber nicht gründlich getestet. Verwenden Sie es, wenn Sie für Ihre App-Entwicklung möchten.
quelle
Ich habe diese Frage gefunden, als ich versuchte, mein Problem mit dem Ausführen von sequelize seed zu lösen: generiere den Befehl cli:
Lassen Sie mich auf den Punkt kommen. Ich wollte einen kurzen Skriptbefehl in meiner Datei package.json haben und gleichzeitig das Argument --name angeben
Die Antwort kam nach einigen Experimenten. Hier ist mein Befehl in package.json
... und hier ist ein Beispiel für die Ausführung im Terminal, um eine Seed-Datei für einen Benutzer zu generieren
Zu Ihrer Information
quelle
-- --arg1, ...
?npm run script_target - <argument> Grundsätzlich ist dies die Art und Weise, wie die Befehlszeilenargumente übergeben werden. Dies funktioniert jedoch nur, wenn im Skript nur ein Befehl ausgeführt wird, wie ich einen Befehl ausführe, dh npm run start - 4200
Dies wird ausgeführt, um Befehlszeilenparameter zu übergeben, aber was ist, wenn wir mehr als einen Befehl zusammen ausführen, wie z. B. npm run build c: / workspace / file
Beim Ausführen von copy c: / file && ng build c: / work space / file wird es jedoch so interpretiert, und es wird erwartet, dass so etwas wie copy c: / file c: / work space / file && ng build erstellt wird
Hinweis: - Befehlszeilenparameter funktionieren also nur, wenn nur ein Befehl in einem Skript erwartet wird.
Ich habe oben einige Antworten gelesen, in denen einige schreiben, dass Sie mit dem Symbol $ auf den Befehlszeilenparameter zugreifen können, aber das wird nicht funktionieren
quelle
Ich weiß, dass es bereits eine genehmigte Antwort gibt, aber ich mag diesen JSON-Ansatz irgendwie.
Normalerweise habe ich 1 Var, die ich brauche, wie zum Beispiel einen Projektnamen, also finde ich das schnell und einfach.
Außerdem habe ich so etwas oft in meiner package.json
Und da ich gierig bin, möchte ich "alles", NODE_ENV und das CMD-Line-Arg-Zeug.
Sie greifen einfach in Ihrer Datei auf diese Dinge zu (in meinem Fall local.js).
Sie müssen nur dieses Bit darüber haben (ich verwende übrigens v10.16.0)
Wie auch immer, Frage bereits beantwortet. Ich dachte, ich würde teilen, da ich diese Methode oft benutze.
quelle