Dans mon package.json
j'ai ces deux scripts:
"scripts": {
"start-watch": "nodemon run-babel index.js",
"wp-server": "webpack-dev-server",
}
Je dois exécuter ces 2 scripts en parallèle chaque fois que je commence à développer dans Node.js. La première chose à laquelle j'ai pensé était d'ajouter un troisième script comme celui-ci:
"dev": "npm run start-watch && npm run wp-server"
... mais il faudra attendre pour start-watch
terminer avant de courir wp-server
.
Comment puis-je les exécuter en parallèle? Veuillez garder à l'esprit que j'ai besoin de voir la output
de ces commandes. De plus, si votre solution implique un outil de construction, je préfère utiliser gulp
plutôt que grunt
parce que je l'utilise déjà dans un autre projet.
javascript
node.js
build
André Pena
la source
la source
&&
exécutera vos scripts séquentiellement tout&
en les exécutant en parallèle .npm run start-watch & npm run wp-server
. Cela exécutera la première commande en tant que thread d'arrière-plan. Cela fonctionne très bien lorsque l'une des commandes n'est pas longue et n'a pas besoin d'être fermée manuellement plus tard. Quelque chose commeconcurrently
vous permet de tuer tous les threads en même temps avec CTRL-C.Réponses:
Utilisez un package appelé simultanément .
npm i concurrently --save-dev
Ensuite, configurez votre
npm run dev
tâche comme suit:la source
node ./node_modules/concurrently/src/main.js
n'est pas nécessaire.concurrent
fonctionnera très bien dans les scripts parce que le module installe un bac pour./node_modules/.bin/concurrent
concurrently
utilise plusieurs flux qui gâchent la sortie de la console (les couleurs peuvent devenir étranges, le curseur disparu) alors qu'ilparallelshell
n'a pas ce problème .--raw
mode pour conserver les couleurs en sortie.Si vous utilisez un environnement de type UNIX, utilisez-le simplement
&
comme séparateur:Sinon, si vous êtes intéressé par une solution multiplateforme, vous pouvez utiliser le module npm-run-all :
la source
a && b
démarreb
après avoira
terminé avec succès, mais nodemon ne s'arrête jamais sans erreurs, donc cela ne peut pas fonctionner.a & b
démarrea
, le place en arrière-plan et démarreb
immédiatement. Gagner!a | b
redirige la sortiea
standard vers la sortie standardb
qui nécessite que les deux s'exécutent simultanément. Bien que cela puisse sembler avoir l'effet souhaité, vous ne devriez pas l'utiliser ici.&
est une très mauvaise idée car elle détache le processus. Cela signifie quenpm
ce ne sera plus le processus parent. Vous vous retrouverez avec un zombienpm run start-watch
qui ne sera pas tué avecctrl-c
.wait
pour atténuer le problème avec les processus de suspension:"dev": "npm run start-watch & npm run wp-server & wait"
&
sous unix empêche la commande de répondre à Cc / Cz et empêche également son code de retour de se propager en cas d'échec.Depuis Windows cmd, vous pouvez utiliser
start
:Chaque commande lancée de cette façon démarre dans sa propre fenêtre.
la source
&&
attend la fin de la première commande avant de démarrer la deuxième commande et une tâche d'observation ne se terminera jamais.Vous devez utiliser npm-run-all (ou
concurrently
,parallelshell
), car il a plus de contrôle sur le démarrage et la suppression des commandes. Les opérateurs&
,|
sont de mauvaises idées parce que vous aurez besoin d'arrêter manuellement après tous les tests sont terminés.Voici un exemple de test de rapporteur via npm:
-p
= Exécuter des commandes en parallèle.-r
= Tuez toutes les commandes lorsque l'une d'elles se termine par un code de sortie nul.L'exécution
npm run test
démarrera le pilote Selenium, démarrera le serveur http (pour vous servir des fichiers) et exécutera des tests de rapporteur. Une fois tous les tests terminés, il fermera le serveur http et le pilote sélénium.la source
gulp
etgulp-sync
?Vous pouvez en utiliser un
&
pour le script d'exécution parallèleLien de référence
la source
Une meilleure solution consiste à utiliser
&
la source
&
fonctionne sur Windows, mais cela fonctionne différemment. Sous OSX, il exécutera les deux commandes simultanément, mais sous Windows, il exécutera la première commande et une fois la première commande existante, il exécutera la deuxième commande.J'ai vérifié presque toutes les solutions ci-dessus et seulement avec npm-run-all j'ai pu résoudre tous les problèmes. Le principal avantage sur toutes les autres solutions est la possibilité d' exécuter un script avec des arguments .
Cela me permet d'exécuter la commande avec des arguments comme
npm run test:watch -- Something
.ÉDITER:
Il y en a un de plus utile option pour
npm-run-all
:Ajoutez
-r
à votrenpm-run-all
script pour tuer tous les processus lorsque l'un a terminé avec le code0
. Cela est particulièrement utile lorsque vous exécutez un serveur HTTP et un autre script utilisant le serveur.la source
J'ai une solution multiplateforme sans modules supplémentaires . Je cherchais quelque chose comme un bloc try catch que je pourrais utiliser à la fois dans le cmd.exe et dans le bash.
La solution est celle
command1 || command2
qui semble fonctionner de la même manière dans les deux environnements. La solution pour l'OP est donc:Alors simple
npm start
(etnpm run dev
) fonctionnera sur toutes les plateformes!la source
Si vous remplacez la double esperluette par une seule esperluette, les scripts s'exécuteront simultanément.
la source
Solution rapide
Dans ce cas, je dirais que le meilleur pariSi ce script est pour un module privé destiné à fonctionner uniquement sur des machines basées sur * nix , vous pouvez utiliser l'opérateur de contrôle pour les processus de forking, qui ressemble à ceci:&
Un exemple de cette opération dans un fichier package.json partiel:
Vous les exécuteriez ensuite tous les deux en parallèle via
npm run serve-bundle
. Vous pouvez améliorer les scripts pour sortir les pids du processus forké dans un fichier comme ceci:Google quelque chose comme opérateur de contrôle bash pour la fourche pour en savoir plus sur son fonctionnement. J'ai également fourni un contexte supplémentaire concernant l'utilisation des techniques Unix dans les projets Node ci-dessous:
Contexte supplémentaire RE: Unix Tools & Node.js
Si vous n'êtes pas sous Windows, les outils / techniques Unix fonctionnent souvent bien pour réaliser quelque chose avec les scripts Node car:
Les modules pour les tâches système dans Nodeland sont également souvent des abstractions ou des approximations des outils Unix, de
fs
àstreams
.la source
&
opérateur n'est pas pris en charge sous Windows.Éditer:
Vous devez avoir préalablement installé npm-run-all . Consultez également cette page pour d'autres scénarios d'utilisation.
la source
Que diriez-vous de bifurquer
Une autre option pour exécuter plusieurs scripts Node consiste à utiliser un seul script Node, qui peut en générer de nombreux autres. Le fork est pris en charge nativement dans Node, il n'ajoute donc aucune dépendance et est multiplateforme.
Exemple minimal
Cela exécuterait simplement les scripts tels quels et supposerait qu'ils se trouvent dans le répertoire du script parent.
Exemple détaillé
Cela exécuterait les scripts avec des arguments et configurés par les nombreuses options disponibles.
Communiquer avec des scripts fourchus
Forking a également l'avantage supplémentaire que le script parent peut recevoir des événements des processus enfants forkés ainsi que les renvoyer. Un exemple courant est que le script parent tue ses enfants fourchus.
Pour plus d'événements et de méthodes disponibles, consultez la
ChildProcess
documentationla source
J'ai rencontré des problèmes avec
&
et|
, quels états de sortie et lancement d'erreur, respectivement.D'autres solutions veulent exécuter n'importe quelle tâche avec un nom donné, comme npm-run-all, ce qui n'était pas mon cas d'utilisation.
J'ai donc créé npm-run-parallel qui exécute les scripts npm de manière asynchrone et rend compte quand ils ont terminé.
Donc, pour vos scripts, ce serait:
npm-run-parallel wp-server start-watch
la source
Dans mon cas, j'ai deux projets, l'un était l' interface utilisateur et l'autre API , et les deux ont leur propre script dans leurs
package.json
fichiers respectifs .Alors, voici ce que j'ai fait.
la source
node app
) et API (Angular dans un sous-dossier src , je supposecd src/ng serve
), seule la première partie fonctionne. Par exemplenode app& cd src& ng serve
.package.json:
Plus d'informations: https://github.com/mysticatea/npm-run-all/blob/master/docs/npm-run-all.md
la source
J'utilise npm-run-all depuis un certain temps, mais je ne m'en suis jamais entendu, car la sortie de la commande en mode veille ne fonctionne pas bien ensemble. Par exemple, si je commence
create-react-app
etjest
en mode veille, je ne pourrai voir que la sortie de la dernière commande que j'ai exécutée. Donc la plupart du temps, j'exécutais toutes mes commandes manuellement ...C'est pourquoi, j'implémente ma propre lib, run-screen . C'est encore un projet très jeune (d'hier: p) mais ça vaut peut-être le coup d'oeil, dans votre cas ce serait:
Ensuite, vous appuyez sur la touche numérique
1
pour voir la sortie dewp-server
et appuyez sur0
pour voir la sortie destart-watch
.la source
Ma solution est similaire à celle de Piittis, mais j'ai eu quelques problèmes avec Windows. J'ai donc dû valider pour win32.
la source
Script de nœud simple pour vous permettre de démarrer sans trop de tracas. Utiliser readline pour combiner les sorties afin que les lignes ne soient pas altérées.
la source
ce travail dans les fenêtres
la source