Hoe kan ik meerdere npm-scripts parallel uitvoeren?

In mijn package.jsonheb ik deze twee scripts:

 "scripts": {
    "start-watch": "nodemon run-babel index.js",
    "wp-server": "webpack-dev-server",
  }

Ik moet deze 2 scripts paralleluitvoeren telkens als ik begin met ontwikkelen in Node.js. Het eerste waar ik aan dacht was het toevoegen van een derde script, zoals dit:

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

… maar dat zal wachten tot start-watchklaar is voordat wp-serverwordt uitgevoerd.

Hoe kan ik deze parallel uitvoeren?Houd er rekening mee dat ik de outputvan deze commando’s moet zien. Als uw oplossing een build-tool omvat, gebruik ik liever gulpin plaats van gruntomdat ik het al in een ander project gebruik.


Antwoord 1, autoriteit 100%

Gebruik een pakket met de naam gelijktijdig.

npm i concurrently --save-dev

Stel vervolgens uw taak npm run devals volgt in:

"dev": "concurrently --kill-others \"npm run start-watch\" \"npm run wp-server\""

Antwoord 2, autoriteit 27%

Als je een UNIX-achtige omgeving gebruikt, gebruik dan gewoon &als scheidingsteken:

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

Anders kunt u, als u geïnteresseerd bent in een platformonafhankelijke oplossing, npm-run-allgebruiken module:

"dev": "npm-run-all --parallel start-watch wp-server"

Antwoord 3, autoriteit 13%

Vanuit windows cmd kunt u startgebruiken:

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

Elke opdracht die op deze manier wordt gestart, begint in zijn eigen venster.


Antwoord 4, autoriteit 10%

U moet npm-run-allgebruiken (of concurrently, parallelshell), omdat het meer controle heeft over het starten en doden van commando’s. De operators &, |zijn slechte ideeën omdat je het handmatig moet stoppen nadat alle tests zijn voltooid.

Dit is een voorbeeld voor gradenboogtesten via npm:

scripts: {
  "webdriver-start": "./node_modules/protractor/bin/webdriver-manager update && ./node_modules/protractor/bin/webdriver-manager start",
  "protractor": "./node_modules/protractor/bin/protractor ./tests/protractor.conf.js",
  "http-server": "./node_modules/http-server/bin/http-server -a localhost -p 8000",
  "test": "npm-run-all -p -r webdriver-start http-server protractor"
}

-p= Voer opdrachten parallel uit.

-r= Stop alle commando’s wanneer een ervan eindigt met een afsluitcode van nul.

Als u npm run testuitvoert, wordt de Selenium-driver gestart, wordt de http-server gestart (om u bestanden te bezorgen) en worden gradenboogtests uitgevoerd. Zodra alle tests zijn voltooid, worden de http-server en het seleniumstuurprogramma gesloten.


Antwoord 5, autoriteit 5%

U kunt één &gebruiken voor parallel uitgevoerd script

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

Referentielink


Antwoord 6

npm-run-all --parallel task1 task2

bewerken:

Je moet npm-run-allvooraf hebben geïnstalleerd. Kijk ook op deze paginavoor andere gebruiksscenario’s.


Antwoord 7

Snelle oplossing

In dit geval zou ik zeggen de beste gokAls dit script voor een privémodule is die bedoeld is om alleen op *nix-gebaseerde machines te draaien, kunt u de besturingsoperator voor forking-processen, die er als volgt uitziet: &

Een voorbeeld om dit te doen in een gedeeltelijk package.json-bestand:

{
  "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 &"
  }

Je voert ze dan beide parallel uit via npm run serve-bundle. U kunt de scripts verbeteren om de pids van het gevorkte proces naar een bestand als volgt uit te voeren:

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

Google iets als bash control operator for forkingvoor meer informatie over hoe het werkt. Ik heb ook wat meer context gegeven met betrekking tot het gebruik van Unix-technieken in Node-projecten hieronder:

Verdere context RE: Unix Tools & Node.js

Als je geen Windows gebruikt, werken Unix-tools/-technieken vaak goed om iets te bereiken met Node-scripts, omdat:

  1. Veel van Node.js imiteert liefdevol Unix-principes
  2. Je gebruikt *nix (incl. OS X) en NPM gebruikt toch een shell

Modules voor systeemtaken in Nodeland zijn ook vaak abstracties of benaderingen van Unix-tools, van fstot streams.


Antwoord 8

npm install npm-run-all --save-dev

pakket.json:

"scripts": {
  "start-watch": "...",
  "wp-server": "...",
  "dev": "npm-run-all --parallel start-watch wp-server"
}

Meer info: https: //github.com/mysticatea/npm-run-all/blob/master/docs/npm-run-all.md


9

Eenvoudig node-script om u op weg te helpen zonder al te veel gedoe. Readline gebruiken om outputs te combineren zodat de lijnen niet verminkt raken.

const { spawn } = require('child_process');
const readline = require('readline');
[
  spawn('npm', ['run', 'start-watch']),
  spawn('npm', ['run', 'wp-server'])
].forEach(child => {
    readline.createInterface({
        input: child.stdout
    }).on('line', console.log);
    readline.createInterface({
        input: child.stderr,
    }).on('line', console.log);
});

Antwoord 10

Ik gebruik al een tijdje npm-run-all, maar ik kon er nooit mee overweg, omdat de uitvoer van het commando in de horlogemodus niet goed samenwerkt. Als ik bijvoorbeeld create-react-appen jeststart in de horlogemodus, kan ik alleen de uitvoer zien van het laatste commando dat ik heb uitgevoerd. Dus meestal voerde ik al mijn opdrachten handmatig uit…

Daarom implementeer ik mijn eigen lib, run-screen. Het is nog een heel jong project (van gisteren :p ) maar het is misschien de moeite waard om ernaar te kijken, in jouw geval zou het zijn:

run-screen "npm run start-watch" "npm run wp-server"

Druk vervolgens op de numerieke toets 1om de uitvoer van wp-serverte zien en druk op 0om de uitvoer van start-watch.


Antwoord 11

Dit werkte voor mij

{
"start-express": "tsc && nodemon dist/server/server.js",
"start-react": "react-scripts start",
"start-both": "npm -p -r run start-react && -p -r npm run start-express"
}

Zowel client als server zijn in typoscript geschreven.

De React-app is gemaakt met create-react-app met het typescript-sjabloon en staat in de standaard src-directory.

Express staat in de servermap en het invoerbestand is server.js

typescript code en omgezet in js en in de dist directory geplaatst .

bekijk mijn project voor meer info: https://github.com/nickjohngray/staticbackeditor

UPDATE:
npm run dev bellen om te beginnen

{"server": "tsc-watch --onSuccess \"node ./dist/server/index.js\"",
"start-server-dev": "npm run build-server-dev && node src/server/index.js",
"client": "webpack-dev-server --mode development --devtool inline-source-map --hot",
"dev": "concurrently \"npm run build-server-dev\"  \"npm run server\" \"npm run client\""}

Antwoord 12

Je kunt ook preen postgebruiken als voorvoegsels voor je specifieke script.

 "scripts": {
    "predev": "nodemon run-babel index.js &",
    "dev": "webpack-dev-server"
  }

En voer dan uit:
npm run dev


Antwoord 13

Alleen shell-scripting gebruiken, op Linux.

"scripts": {
  "cmd": "{ trap 'trap \" \" TERM; kill 0; wait' INT TERM; } && blocking1 & blocking2 & wait"
}

npm run cmd
en toen
^Czal kinderen doden en wachten op een schone uitgang.


Antwoord 14

Een eenvoudige en native manier voor Windows CMD

"start /b npm run bg-task1 && start /b npm run bg-task2 && npm run main-task"

(start /bbetekent starten op de achtergrond)


Antwoord 15

Omdat je misschien meer en meer aan deze scripts moet toevoegen, wordt het rommelig en moeilijker te gebruiken. Wat als u enkele voorwaarden nodig heeft om te controleren, variabelen om te gebruiken? Dus ik raad je aan om te kijken naar google/zxwaarmee je js kunt gebruiken om scripts te maken.

Eenvoudig gebruik:

  1. installeer zx: npm i -g zx
  2. voeg package.json-opdrachten toe (optioneel, je kunt alles naar scripts verplaatsen):
 "scripts": {
    "dev": "zx ./scripts/dev.mjs", // run script
    "build:dev": "tsc -w", // compile in watch mode
    "build": "tsc", // compile
    "start": "node dist/index.js", // run
    "start:dev": "nodemon dist/index.js", // run in watch mode
  },
  1. maak dev.mjsscriptbestand:
#!/usr/bin/env zx
await $`yarn build`; // prebuild if dist is empty
await Promise.all([$`yarn start:dev`, $`yarn build:dev`]); // run in parallel

Elke keer dat u een dev-server wilt starten, voert u gewoon yarn devof npm run devuit.

Het zal eerst ts->js compileren en vervolgens de typecrpt-compiler en server parallel in watch-modus uitvoeren. Wanneer u uw ts-bestand wijzigt, wordt het opnieuw gecompileerd door tsc->nodemon zal de server opnieuw opstarten.


Geavanceerd programmatisch gebruik

Laad env-variabelen, compileer ts in watch-modus en voer de server opnieuw uit van dist bij wijzigingen (dev.mjs):

#!/usr/bin/env zx
import nodemon from "nodemon";
import dotenv from "dotenv";
import path from "path";
import { fileURLToPath } from "url";
// load env variables
loadEnvVariables("../env/.env");
await Promise.all([
  // compile in watch mode (will recompile on changes in .ts files)
  $`tsc -w`,
  // wait for tsc to compile for first time and rerun server on any changes (tsc emited .js files)
  sleep(4000).then(() =>
    nodemon({
      script: "dist/index.js",
    })
  ),
]);
function sleep(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}
function getDirname() {
  return path.dirname(fileURLToPath(import.meta.url));
}
function loadEnvVariables(relativePath) {
  const { error, parsed } = dotenv.config({
    path: path.join(getDirname(), relativePath),
  });
  if (error) {
    throw error;
  }
  return parsed;
}

Other episodes