NPM-Skripte nacheinander ausführen

148

Nehmen wir an, ich habe

"scripts": {
    "pre-build": "echo \"Welcome\" && exit 1",
    "build_logic": "start cmd.exe @cmd /k \"yo esri-appbuilder-js:widget && exit 1\"",
    "post_build":  "start C:\\WebAppBuilderForArcGIS\\startupShortcut",
    "exit" : "start cmd.exe @cmd /k \"echo \"goodbye\" && exit 1\""
  },

Welchen NPM-Befehl kann ich ausführen, damit alle diese Skripte nacheinander gestartet werden? Wenn ich Pre / Post-Fixing verwende, werden sie nacheinander gestartet, aber sie warten nicht, bis das übergeordnete Skript fertig ist, bevor sie ausgeführt werden. Ich gehe davon aus, dass die einzige Lösung wie folgt lautet: Wie kann ich Gulp-Aufgaben nacheinander auslösen, wenn Shell-Befehle in einer Hilfsfunktion von async.series ausgelöst werden? ? Ich weiß, dass dies mit Gulp möglich ist, aber ich möchte vorerst bei NPM bleiben, um seine Fähigkeiten zu erkunden. Vielen Dank für jede Hilfe!

Reis
quelle
Aktualisierte Antwort unten
Tzach Ovadia
Gemäß der StartBefehlsdokumentation sollten Sie in der Lage sein, /waitParameter zu verwenden (Anwendung starten und warten, bis sie beendet ist)
Tzach Ovadia

Antworten:

315

Rufen Sie diese Skripte über npm run auf und verketten Sie sie mit doppeltem kaufmännischem Und &&:

npm run pre-build && npm run build_logic && npm run post_build && npm run exit

Erläuterung:

  • Verwenden Sie &&(doppeltes kaufmännisches Und) für die sequentielle Ausführung.
  • Verwenden Sie &(einzelnes kaufmännisches Und) für die parallele Ausführung.
Mobiletainment
quelle
4
Dies funktioniert am besten, da es in der richtigen Reihenfolge ausgeführt wird, da jeder Befehl erst ausgeführt wird, wenn die vorherigen Schritte abgeschlossen sind, wie im OP angefordert. Danke
Reis
19
&&werden von der Shell ausgewertet und funktionieren unter Windows nicht.
Bernhard Döbler
11
Dies sollte nicht die akzeptierte Antwort sein. Laut @ BernhardDöbler ist die &&Syntax ein UNIX-Konstrukt. Auf Windows-Computern verhält es sich falsch, was möglicherweise schwerwiegende Folgen für Ihren Erstellungsprozess hat.
Rafe Goldberg
3
@RafeGoldberg Der Operator && hat in Windows- und * nix-Umgebungen das gleiche Ausführungsverhalten, dh die sequentielle Ausführung. Es sei denn, wir vermissen alle etwas?
Reis
3
@ Rice oy vey; war dumm und mischte meine einfachen und doppelten kaufmännischen Und-Operatoren. In den npm-run-allDokumenten heißt es: "Manchmal führen wir &mehrere Befehle gleichzeitig aus, aber Windows ' cmd.exe... unterstützt [diesen Operator] nicht." Es scheint also, dass Sie Recht hatten - zumindest nach meiner kurzen Recherche &&scheint der Betreiber perfekt plattformübergreifend kompatibel zu sein.
Rafe Goldberg
31

Nach der großartigen Antwort von @ Mobiletainment können Sie auch npm-run-all verwenden , um den Befehl viel kürzer und lesbarer zu machen. In deinem Fall:

"scripts": {
    ...
    "build": "run-s pre-build build_logic post_build exit"
}

run-sist eine Verknüpfung npm-run-all, die alle angegebenen npm-Skripte nacheinander ausführt, daher die -s( run-sist eine kürzere Version von npm-run-all -s).

Oder ein.
quelle
19

Sie können sie einfach in ein anderes Skript einfügen. "start": "pre-build && build_logic && post_build && exit"

Dave V.
quelle
2
Ich würde von ihnen verlangen, dass sie aufeinander warten, bis sie fertig sind. Diese werden nacheinander ausgelöst, aber nicht warten.
Reis
2
Ich denke nicht, dass dies ein Node / Npm-Problem ist. Der startBefehl, den Sie technisch in Windows ausführen, ist beendet. Verwenden Sie das /waitFlag mit, um startzu erzwingen, dass die startAnwendung geöffnet bleibt, bis auch die interne Methode abgeschlossen ist.
dvlsg
Um dies zu testen, führen Sie start notepadeine Eingabeaufforderung aus und sehen Sie sich die ursprüngliche Eingabeaufforderung an. Sie sollten in der Lage sein, einen anderen Befehl einzugeben. Dann renne start /wait notepad. Der startBefehl sollte weiterhin "ausgeführt" werden, während Ihr Notizblockfenster geöffnet ist (sehen Sie sich die Eingabeaufforderung erneut an). Sobald Sie den Editor schließen, ist der Vorgang startabgeschlossen.
dvlsg
Die \ wait-Lösung funktioniert nicht für Befehle, die über doppeltes kaufmännisches Und oder feste npm-Befehle vor / nach dem Anhängen angehängt werden.
Reis
15

Sie können Ihre Skripts prefix preund postso werden sie automatisch ausgeführt werden:

"scripts": {
  "prebuild": "echo \"Welcome\" && exit 1",
  "build": "start cmd.exe @cmd /k \"yo esri-appbuilder-js:widget && exit 1\"",
  "postbuild":  "start C:\\WebAppBuilderForArcGIS\\startupShortcut",
  "exit" : "start cmd.exe @cmd /k \"echo \"goodbye\" && exit 1\""
}

dann renne npm run build

Tzach Ovadia
quelle
Dies funktioniert nicht, wie in der Frage angegeben: "Wenn ich Pre / Post-Fixing verwende, werden sie nacheinander gestartet, aber sie warten nicht, bis das übergeordnete Skript fertig ist, bevor sie ausgeführt werden."
Russell Chisholm
3

Du kannst es versuchen:


"scripts": {
  "clean-dist": "rm -f ./dist/*.js && rm -f ./dist/*.map",
  "build": "npm run clean-dist && parcel build ./packages/index.html"
},
Muhammed Moussa
quelle
2

Sie können npm-run-all verwenden , um mehrere Befehle auf viele verschiedene Arten zu kombinieren

Zum Beispiel, wenn Sie die folgenden Skripte in Ihrem hatten package.json:

"scripts": {
    "clean": "rimraf dist",
    "lint":  "eslint src",
    "build": "babel src -o lib"
}

Sie können sie alle nacheinander wie folgt ausführen:

$ npm-run-all clean lint build

In dieser Frage erfahren Sie, wie Sie mehrere npm-Befehle parallel ausführen

KyleMit
quelle
1
Dies ist der richtige Weg. npm-run-all ist das Beste. Und wird eine package.json produzieren, die plattformübergreifend ist.
Robert