Exécution séquentielle des scripts NPM


150

Disons que j'ai

"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\""
  },

Quelle commande NPM puis-je exécuter pour permettre à tous ces scripts de se lancer séquentiellement. Lorsque j'utilise la correction pré / post, ils se lancent séquentiellement mais n'attendent pas que le script parent se termine avant de s'exécuter. Je suppose que la seule solution est la suivante: Comment faire pour que les tâches Gulp se déclenchent séquentiellement lors du déclenchement de commandes shell dans une fonction d'assistance async.series? ? Je sais que cela peut être fait avec Gulp mais je voudrais rester avec NPM pour le moment pour explorer ses capacités. Merci pour toute aide!


Réponse mise à jour en bas
— Tzach Ovadia

Selon la documentation de la Startcommande, vous devriez pouvoir utiliser le /waitparamètre (Démarrer l'application et attendre qu'elle se termine)
— Tzach Ovadia

Réponses:


317

Appelez ces scripts via npm run et enchaînez-les avec une double esperluette &&:

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

Explication:

  • Utilisez &&(double esperluette) pour une exécution séquentielle.
  • Utilisez &(une seule esperluette) pour une exécution parallèle.

4
Cela fonctionne le mieux car il s'exécute dans l'ordre, étant donné que chaque commande ne s'exécute pas tant que les previos ne sont pas terminées, comme demandé dans l'OP. Merci
— Rice

20
&&sont évalués par le shell et ne fonctionnent pas sous Windows.
— Bernhard Döbler

12
Cela ne devrait pas être la réponse acceptée. Selon @ BernhardDöbler, la &&syntaxe est une construction UNIX. Il se comportera de manière incorrecte sur les machines de Windows, avec des conséquences potentiellement graves pour votre processus de construction.
— Rafe Goldberg

3
@RafeGoldberg L'opérateur && a le même comportement d'exécution dans les fenêtres et les environnements * nix, c'est-à-dire l'exécution séquentielle..À moins qu'il y ait quelque chose qui nous manque tous?
— Rice

3
@Rice oy vey; était stupide et mélangeait mes opérateurs simples et doubles-esperluette. Selon la npm-run-alldocumentation: «nous utilisons parfois &pour exécuter plusieurs commandes en parallèle, mais Windows ' cmd.exe... ne prend pas en charge [cet opérateur].» Il semblerait donc que vous aviez raison - au moins d'après ma brève recherche, l' &&opérateur semble parfaitement compatible multiplateforme.
— Rafe Goldberg

31

Suite à l'excellente réponse de @ Mobiletainment , vous pouvez également utiliser npm-run-all pour rendre la commande beaucoup plus courte et beaucoup plus lisible. Dans ton cas:

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

run-sest un raccourci npm-run-allfournit, qui exécute tous les scripts npm donnés séquentiellement, d'où le -s( run-sest une version plus courte de npm-run-all -s).


19

Vous pouvez simplement les insérer dans un autre script. "start": "pre-build && build_logic && post_build && exit"


2
Je les obligerais à attendre l'un l'autre pour finir, ceux-ci se déclencheront séquentiellement mais n'attendront pas.
— Rice

2
Je ne pense pas que ce soit un problème de nœud / npm. La startcommande que vous exécutez dans Windows est techniquement terminée. Utilisez l' /waitindicateur avec startpour forcer l' startapplication à rester ouverte jusqu'à ce que la méthode interne soit également terminée.
— dvlsg

Pour tester ceci - exécutez à start notepadpartir d'une invite de commande, puis jetez un œil à l'invite de commande d'origine. Vous devriez pouvoir saisir une autre commande. Alors courez start /wait notepad. La startcommande doit continuer à «s'exécuter» pendant que la fenêtre de votre bloc-notes est ouverte (jetez à nouveau un coup d'œil à l'invite de commande). Ensuite, une fois que vous fermez le bloc-notes, ce startsera terminé.
— dvlsg

La solution \ wait ne fonctionne pas pour les commandes ajoutées via une double esperluette ou des commandes npm pré / post fixes.
— Rice

15

Vous pouvez préfixer vos scripts preet postainsi ils s'exécuteront automatiquement:

"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\""
}

puis courir npm run build


cela ne fonctionne pas, comme indiqué dans la question: "Quand j'utilise la correction pré / post, ils se lancent séquentiellement mais ils n'attendent pas que le script parent se termine avant de s'exécuter."
— Russell Chisholm

3

tu peux essayer:


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

2

Vous pouvez utiliser npm-run-all pour combiner plusieurs commandes de différentes manières

Par exemple, si vous aviez les scripts suivants dans votre package.json:

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

Vous pouvez les exécuter tous séquentiellement comme ceci:

$ npm-run-all clean lint build

Voir cette question pour savoir comment exécuter plusieurs commandes npm en parallèle


1
C'est la voie à suivre. npm-run-all est le meilleur. Et produira un package.json qui est multiplateforme.
— Robert
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.