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!

Riz
la source
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.
Mobiletainment
la source
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).

Ou A.
la source
19

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

Dave V
la source
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

Tzach Ovadia
la source
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"
},
Muhammed Moussa
la source
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

KyleMit
la source
1
C'est la voie à suivre. npm-run-all est le meilleur. Et produira un package.json qui est multiplateforme.
Robert