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.