In meinem habe package.json
ich diese beiden Skripte:
"scripts": {
"start-watch": "nodemon run-babel index.js",
"wp-server": "webpack-dev-server",
}
Ich muss diese beiden Skripte jedes Mal parallel ausführen, wenn ich mit der Entwicklung in Node.js beginne. Das erste, woran ich dachte, war das Hinzufügen eines dritten Skripts wie dieses:
"dev": "npm run start-watch && npm run wp-server"
... aber das wird warten, start-watch
bis es fertig ist, bevor es läuft wp-server
.
Wie kann ich diese parallel ausführen? Bitte denken Sie daran, dass ich die output
dieser Befehle sehen muss. Wenn Ihre Lösung ein Build-Tool enthält, würde ich es lieber verwenden, gulp
anstatt grunt
es bereits in einem anderen Projekt zu verwenden.
javascript
node.js
build
André Pena
quelle
quelle
&&
führt Ihre Skripte nacheinander aus, während&
sie parallel ausgeführt werden .npm run start-watch & npm run wp-server
. Dadurch wird der erste Befehl als Hintergrundthread ausgeführt. Dies funktioniert sehr gut, wenn einer der Befehle nicht lange ausgeführt wird und später nicht manuell beendet werden muss. So etwasconcurrently
können Sie alle Fäden in der gleichen Zeit mit STRG + C töten.Antworten:
Verwenden Sie ein Paket, das gleichzeitig aufgerufen wird .
npm i concurrently --save-dev
Richten Sie dann Ihre
npm run dev
Aufgabe folgendermaßen ein:quelle
node ./node_modules/concurrently/src/main.js
wird nicht gebraucht.concurrent
ganz gut in Skripten arbeiten , da das Modul einen Behälter zu installieren./node_modules/.bin/concurrent
concurrently
mehrere Streams verwendet, die die Konsolenausgabe beeinträchtigen (Farben können seltsam werden, Cursor weg), während dieses Problemparallelshell
nicht auftritt .--raw
Modus verwenden, um Farben in der Ausgabe beizubehalten.Wenn Sie eine UNIX-ähnliche Umgebung verwenden, verwenden Sie einfach
&
als Trennzeichen:Wenn Sie an einer plattformübergreifenden Lösung interessiert sind, können Sie das Modul npm-run-all verwenden :
quelle
a && b
startetb
nacha
erfolgreichem Abschluss, aber nodemon stoppt nie ohne Fehler, so dass das nicht funktionieren kann.a & b
starteta
, verschiebt es in den Hintergrund und startetb
sofort. Sieg!a | b
leitet die stdout vona
zu der stdin, fürb
die beide gleichzeitig laufen müssen. Obwohl dies den gewünschten Effekt zu haben scheint, sollten Sie es hier nicht verwenden.&
ist eine wirklich schlechte Idee, da sie den Prozess löst. Dies bedeutet, dass diesnpm
nicht mehr der übergeordnete Prozess ist. Sie werden mit einem Zombie enden, mitnpm run start-watch
dem Sie nicht getötet werdenctrl-c
.wait
, um das Problem mit hängenden Prozessen zu mildern:"dev": "npm run start-watch & npm run wp-server & wait"
&
Unix verhindert der Befehl jedoch, dass er auf Cc / Cz reagiert, und verhindert auch, dass sich sein Rückkehrcode im Falle eines Fehlers ausbreitet.Unter Windows Cmd können Sie Folgendes verwenden
start
:Jeder auf diese Weise gestartete Befehl startet in einem eigenen Fenster.
quelle
&&
vor dem Starten des zweiten Befehls auf den Abschluss des ersten Befehls gewartet wird und eine Überwachungsaufgabe niemals beendet wird.Sie sollten npm-run-all (oder
concurrently
,parallelshell
) verwenden, da es mehr Kontrolle über das Starten und Beenden von Befehlen hat. Die Betreiber&
,|
sind schlechte Ideen , weil Sie manuell brauchen, um es zu stoppen , nachdem alle Tests abgeschlossen sind.Dies ist ein Beispiel für Winkelmessertests bis npm:
-p
= Befehle parallel ausführen.-r
= Töte alle Befehle, wenn einer von ihnen mit einem Exit-Code von Null endet.Durch Ausführen
npm run test
wird der Selenium-Treiber gestartet, der http-Server gestartet (um Ihnen Dateien bereitzustellen) und Winkelmessertests ausgeführt. Sobald alle Tests abgeschlossen sind, werden der http-Server und der Selentreiber geschlossen.quelle
gulp
und verwendengulp-sync
?Sie können eines
&
für parallel ausgeführtes Skript verwendenReferenzlink
quelle
Eine bessere Lösung ist zu verwenden
&
quelle
&
funktioniert unter Windows, aber es funktioniert anders. Unter OSX werden beide Befehle gleichzeitig ausgeführt, unter Windows wird jedoch der erste Befehl ausgeführt, und nachdem der erste Befehl vorhanden ist, wird der zweite Befehl ausgeführt.Ich habe fast alle Lösungen von oben überprüft und nur mit npm-run-all konnte ich alle Probleme lösen. Der Hauptvorteil gegenüber allen anderen Lösungen ist die Möglichkeit, Skripte mit Argumenten auszuführen .
Dadurch kann ich einen Befehl mit Argumenten wie ausführen
npm run test:watch -- Something
.BEARBEITEN:
Es gibt noch eine nützliche Option für
npm-run-all
:Fügen Sie
-r
Ihremnpm-run-all
Skript hinzu, um alle Prozesse zu beenden, wenn Sie mit Code fertig sind0
. Dies ist besonders nützlich, wenn Sie einen HTTP-Server und ein anderes Skript ausführen, das den Server verwendet.quelle
Ich habe eine plattformübergreifende Lösung ohne zusätzliche Module . Ich suchte nach so etwas wie einem Try-Catch-Block, den ich sowohl in der cmd.exe als auch in der Bash verwenden konnte.
Die Lösung
command1 || command2
scheint in beiden Umgebungen gleich zu funktionieren. Die Lösung für das OP lautet also:Dann funktioniert einfach
npm start
(undnpm run dev
) auf allen Plattformen!quelle
Wenn Sie das doppelte kaufmännische Und durch ein einzelnes kaufmännisches Und ersetzen, werden die Skripts gleichzeitig ausgeführt.
quelle
Schnelle Lösung
In diesem Fall würde ich die beste Wahl sagen.Wenn dieses Skript für ein privates Modul vorgesehen ist, das nur auf * nix-basierten Computern ausgeführt werden soll , können Sie den Steuerungsoperator zum Verzweigen von Prozessen verwenden. Dies sieht folgendermaßen aus:&
Ein Beispiel hierfür in einer partiellen package.json-Datei:
Sie würden dann beide parallel über ausführen
npm run serve-bundle
. Sie können die Skripte erweitern, um die Pids des gegabelten Prozesses in eine Datei wie folgt auszugeben:Google so etwas wie Bash Control Operator zum Gabeln , um mehr darüber zu erfahren, wie es funktioniert. Im Folgenden habe ich einige weitere Informationen zur Nutzung von Unix-Techniken in Node-Projekten bereitgestellt:
Weiterer Kontext RE: Unix Tools & Node.js.
Wenn Sie nicht unter Windows arbeiten, funktionieren Unix-Tools / -Techniken häufig gut, um mit Node-Skripten etwas zu erreichen, weil:
Module für Systemaufgaben in Nodeland sind häufig auch Abstraktionen oder Annäherungen von Unix-Tools von
fs
bisstreams
.quelle
&
Operator unter Windows nicht unterstützt wird.bearbeiten:
Sie müssen npm-run-all vorher installiert haben. Überprüfen Sie diese Seite auch auf andere Verwendungsszenarien.
quelle
Wie wäre es mit Gabeln
Eine weitere Möglichkeit , mehr Knoten Skripte auszuführen ist mit einem einzelnen Node - Skript, das kann gabelt viele andere. Forking wird in Node nativ unterstützt, fügt also keine Abhängigkeiten hinzu und ist plattformübergreifend.
Minimales Beispiel
Dies würde die Skripte einfach so ausführen, wie sie sind, und davon ausgehen, dass sie sich im Verzeichnis des übergeordneten Skripts befinden.
Ausführliches Beispiel
Dies würde die Skripte mit Argumenten ausführen und durch die vielen verfügbaren Optionen konfiguriert.
Kommunikation mit gegabelten Skripten
Forking hat außerdem den zusätzlichen Vorteil, dass das übergeordnete Skript Ereignisse von den gegabelten untergeordneten Prozessen empfangen und zurücksenden kann. Ein häufiges Beispiel ist, dass das übergeordnete Skript seine gegabelten Kinder tötet.
Weitere verfügbare Ereignisse und Methoden finden Sie in der
ChildProcess
Dokumentationquelle
Ich hatte Probleme mit
&
und|
, die den Status beenden und Fehler auslösen.Andere Lösungen möchten jede Aufgabe mit einem bestimmten Namen ausführen, z. B. npm-run-all, was nicht mein Anwendungsfall war.
Also habe ich npm-run-parallel erstellt , das npm-Skripte asynchron ausführt und zurückmeldet, wenn sie fertig sind.
Für Ihre Skripte wäre es also:
npm-run-parallel wp-server start-watch
quelle
In meinem Fall habe ich zwei Projekte, eines war UI und das andere war API , und beide haben ein eigenes Skript in ihren jeweiligen
package.json
Dateien.Also, hier ist was ich getan habe.
quelle
node app
) und API (Angular in einem Unterordner src , Vermutung istcd src/ng serve
), funktioniert nur der erste Teil. Zum Beispielnode app& cd src& ng serve
.package.json:
Weitere Informationen: https://github.com/mysticatea/npm-run-all/blob/master/docs/npm-run-all.md
quelle
Ich benutze npm-run-all seit einiger Zeit, bin aber nie damit klar gekommen, weil die Ausgabe des Befehls im Überwachungsmodus nicht gut zusammenarbeitet. Zum Beispiel, wenn ich anfange
create-react-app
undjest
im Überwachungsmodus befinde, kann ich nur die Ausgabe des zuletzt ausgeführten Befehls sehen. Die meiste Zeit habe ich alle meine Befehle manuell ausgeführt ...Aus diesem Grund implementiere ich meine eigene lib, run-screen . Es ist noch ein sehr junges Projekt (von gestern: p), aber es könnte sich lohnen, es sich anzusehen, in Ihrem Fall wäre es:
Dann drücken Sie die Zifferntaste
1
, um die Ausgabe vonwp-server
anzuzeigen0
, und drücken , um die Ausgabe von anzuzeigenstart-watch
.quelle
Meine Lösung ähnelt der von Piittis, obwohl ich einige Probleme mit Windows hatte. Also musste ich mich für win32 validieren.
quelle
Einfaches Knotenskript, mit dem Sie ohne großen Aufwand loslegen können. Verwenden Sie readline, um Ausgaben zu kombinieren, damit die Zeilen nicht beschädigt werden.
quelle
diese Arbeit in Windows
quelle