224 votes

Exécution séquentielle des scripts de NPM

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 lancer pour que tous ces scripts se lancent séquentiellement. Lorsque j'utilise la pré/post fixation, ils se lancent séquentiellement mais ils n'attendent pas que le scripts parent se termine avant de s'exécuter. Je suppose que la seule solution est comme : Comment faire en sorte que les tâches Gulp se déclenchent de manière séquentielle lors de l'envoi de commandes shell dans une fonction d'aide async.series ? ? Je sais que cela peut être fait avec Gulp mais je voudrais rester avec NPM pour l'instant pour explorer ses capacités. Merci pour toute aide !

0 votes

Réponse mise à jour en bas de page

0 votes

Selon la documentation de Start vous devriez être en mesure d'utiliser /wait paramètre (Démarrer l'application et attendre qu'elle se termine)

482voto

Mobiletainment Points 4326

Invoquez 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 & (esperluette simple) pour une exécution parallèle.

8 votes

Cette méthode fonctionne le mieux parce qu'elle s'exécute dans l'ordre, étant donné que chaque commande ne s'exécute pas avant que la précédente ne soit terminée, comme demandé dans l'OP. Merci

53 votes

&& sont évalués par le shell et ne fonctionnent pas sous Windows.

0 votes

Disons que j'ai deux scripts dans mon application. Un lance un serveur live (script1), et un autre un serveur dyson (script2). Comment puis-je créer un scripts qui déclenche ces deux scripts précédents ? merci :)

50voto

Or A. Points 507

Suivre le grand @Mobiletainment réponse vous pouvez également utiliser npm-run-all pour rendre la commande beaucoup plus courte et beaucoup plus lisible. Dans votre cas :

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

run-s est un raccourci npm-run-all fournit, qui exécute tous les npm-scripts donnés de manière séquentielle, d'où l'utilisation de l'option -s ( run-s est une version abrégée de npm-run-all -s ).

11 votes

Bien que cela semble être une solution élégante à première vue, il suffit de vérifier l'arbre de dépendance de l'application npm-run-all révèle qu'il a 69 dépendances (sans compter les dev deps !), voir e.g. npm.broofa.com/?q=npm-run-all . Non merci, je ne veux pas être victime d'une attaque de type "sideload" ou d'une farce comme celle de l'affaire du "B". left-pad question.

1 votes

Est-ce que je vois ça correctement, que run-s ne fait que remplacer npm run pre-build && npm run build_logic && npm run post_build && npm run exit ? pourquoi voudrais-je introduire une autre dépendance, qui perturbe tous les développeurs, qui connaissent la && commande ? Dans mon cas, je travaille sur un projet qui utilise la commande suivante run-s (introduit par un autre développeur) et cela m'embrouille plutôt que de m'aider ! Puis-je supprimer run-s en toute sécurité ou est-ce que je manque une différence ici ?

1 votes

Je pense que, si vous avez beaucoup de scripts à exécuter, et que vous utilisez Package.json comme Task Runner (comme Grunt o Gulp ) alors npm-run-all peut être un outil valable. Cependant, si vous voulez exécuter seulement deux scripts comme build y clean (par exemple), je préfère alors utiliser l'option && la syntaxe.

38voto

Tzach Ovadia Points 478

Vous pouvez préfixer vos scripts pre y post afin qu'ils s'exécutent 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 exécutez npm run build

23voto

Dave V Points 1640

Vous pourriez simplement les enchaîner dans un autre script. "start": "pre-build && build_logic && post_build && exit"

3 votes

J'exigerais qu'elles attendent que les autres aient terminé, elles se déclencheront séquentiellement mais n'attendront pas.

3 votes

Je ne pense pas que ce soit un problème de node / npm. Le site start que vous exécutez techniquement dans Windows es terminé. Utilisez le /wait drapeau avec start pour forcer le start reste ouverte jusqu'à ce que la méthode interne soit également terminée.

1 votes

Pour tester cela, exécutez start notepad à partir d'une invite de commande, puis jetez un œil à l'invite de commande originale. Vous devriez être en mesure de taper une autre commande. Ensuite, exécutez start /wait notepad . Le site start devrait continuer à "s'exécuter" tant que votre fenêtre de bloc-notes est ouverte (regardez à nouveau l'invite de commande). Puis, une fois que vous aurez fermé le bloc-notes, start sera terminé.

7voto

KyleMit Points 6937

Vous pouvez utiliser npm-run-all de combiner plusieurs commandes de différentes façons

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

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

Vous pourriez les exécuter séquentiellement comme ceci :

$ npm-run-all clean lint build

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X