[javascript] Comment puis-je exécuter plusieurs scripts NPM en parallèle?



Answers

L'utilisation du package Concurrently fonctionne, mais vous n'en avez pas besoin pour accomplir cela. Vous pouvez simplement utiliser un canal sur des machines UNIX exécutant des tâches simultanées. Je suggère cette méthode plutôt que l'autre car cela vous évite d'avoir à ajouter une dépendance supplémentaire.

"dev": "npm run start-watch | npm run wp-server"
Question

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 cela attendra que start-watch se termine avant de start-watch wp-server .

Comment puis-je les exécuter en parallèle? S'il vous plaît gardez à l'esprit que j'ai besoin de voir la output de ces commandes. Aussi, si votre solution implique un outil de construction, je préfère utiliser gulp au lieu de grunt parce que je l'utilise déjà dans un autre projet.




npm-run-all --parallel task1 task2

modifier:

Vous devez avoir préalablement installé npm-run-all . Vérifiez également option pour d'autres scénarios d'utilisation.




Solution rapide

Dans ce cas, je dirais que le meilleur pari Si 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 faire cela dans un fichier package.json partiel:

{
  "name": "npm-scripts-forking-example",
  "scripts": {
    "bundle": "watchify -vd -p browserify-hmr index.js -o bundle.js",
    "serve":  "http-server -c 1 -a localhost",
    "serve-bundle": "npm run bundle & npm run serve &"
  }

Vous devez ensuite les exécuter 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:

"serve-bundle": "npm run bundle & echo \"$!\" > build/bundle.pid && npm run serve & echo \"$!\" > build/serve.pid && npm run open-browser",

Google quelque chose comme l' opérateur de contrôle bash pour forking pour en savoir plus sur comment cela fonctionne. J'ai également fourni un contexte supplémentaire concernant l'utilisation des techniques Unix dans les projets de nœuds ci-dessous:

Contexte supplémentaire RE: Unix Tools & Node.js

Si vous n'êtes pas sur Windows, les outils / techniques Unix fonctionnent souvent bien pour réaliser quelque chose avec les scripts Node car:

  1. Une grande partie de Node.js imite avec amour les principes Unix
  2. Vous êtes sur * nix (y compris OS X) et NPM utilise un shell de toute façon

Les modules pour les tâches système dans Nodeland sont aussi souvent des abstractions ou des approximations d'outils Unix, de fs à streams .




Dans mon cas, j'ai deux projets l'un était l'interface utilisateur, l'autre était l'API, et la peine d'avoir son propre script là-dedans package.json respectif.

alors voici ce que j'ai fait.

npm run --prefix react start&  npm run --prefix express start&



À partir de Windows cmd, vous pouvez utiliser start :

"dev": "start npm run start-watch && start npm run wp-server"

Chaque commande lancée de cette façon démarre dans sa propre fenêtre.




Une meilleure solution consiste à utiliser &

"dev": "npm run start-watch & npm run wp-server"



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 command1 || command2 command1 || command2 qui semble fonctionner dans les deux environnements même. Donc, la solution pour l'OP est:

"scripts": {
  "start-watch": "nodemon run-babel index.js",
  "wp-server": "webpack-dev-server",
  // first command is for the cmd.exe, second one is for the bash
  "dev": "(start npm run start-watch && start npm run wp-server) || (npm run start-watch & npm run wp-server)",
  "start": "npm run dev"
}

Ensuite, npm start simple (et npm run dev ) fonctionnera sur toutes les plateformes!




Related