ฉันจะรันสคริปต์ npm หลายตัวพร้อมกันได้อย่างไร


542

ในฉันpackage.jsonฉันมีสองสคริปต์เหล่านี้:

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

ฉันต้องเรียกใช้ 2 สคริปต์เหล่านี้ในแบบคู่ขนานทุกครั้งที่ฉันเริ่มพัฒนาใน Node.js สิ่งแรกที่ฉันคิดคือการเพิ่มสคริปต์ที่สามเช่นนี้:

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

... แต่ที่จะรอให้เสร็จสิ้นก่อนที่จะใช้start-watchwp-server

ฉันจะรันสิ่งเหล่านี้แบบขนานได้อย่างไร โปรดจำไว้ว่าฉันต้องดูoutputคำสั่งเหล่านี้ นอกจากนี้หากโซลูชันของคุณเกี่ยวข้องกับเครื่องมือสร้างฉันควรใช้gulpแทนgruntเพราะฉันใช้มันในโครงการอื่นแล้ว


23
&&จะทำงานสคริปต์ของคุณตามลำดับในขณะที่&จะเรียกพวกเขาในแบบคู่ขนาน
vsync

npm run start-watch & npm run wp-serverวิธีที่รวดเร็วในการทำมันเป็น นี่จะรันคำสั่งแรกเป็นเธรดพื้นหลัง วิธีนี้ใช้งานได้ดีจริง ๆ เมื่อคำสั่งอย่างใดอย่างหนึ่งไม่ทำงานนานและไม่จำเป็นต้องออกด้วยตนเองในภายหลัง บางสิ่งที่คล้ายกันconcurrentlyช่วยให้คุณสามารถฆ่าเธรดทั้งหมดในเวลาเดียวกันด้วย CTRL-C
Joshua Pinter

คำตอบ:


616

ใช้แพคเกจที่เรียกว่าพร้อมกัน

npm i concurrently --save-dev

จากนั้นตั้งค่าnpm run devงานของคุณดังนี้:

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

11
node ./node_modules/concurrently/src/main.jsไม่จำเป็น concurrentจะทำงานได้ดีในสคริปต์เพราะโมดูลจะติดตั้ง bin to./node_modules/.bin/concurrent
raine

14
นอกจากนี้ยังมีparallelshell ฉันแนะนำจริง ๆ ว่าconcurrentlyใช้สตรีมหลายรายการที่ยุ่งกับเอาท์พุทคอนโซล (สีอาจแปลกไปหมดเคอร์เซอร์หายไป) ในขณะที่parallelshellไม่มีปัญหานั้น
Stijn de Witt

3
ข้อบกพร่องในการควบคู่กันไปกล่าวโดย @StijndeWitt ในขณะนี้ได้รับการแก้ไขใน2.0.0 ปล่อย คุณสามารถใช้--rawโหมดเพื่อรักษาสีเอาท์พุท
Kimmo

23
@StijndeWitt parallelshell ได้รับการคัดค้านเนื่องจาก npm-run-all github.com/keithamus/ …
jtzero

12
จะต้องมีวิธีที่ดีกว่าสำหรับเราในการจัดการ Javascript build / run script ทุกอย่างสำหรับแพลตฟอร์มนี้ดูเหมือนจะติดกัน คำพูดที่มีคำพูดที่หนีออกมาและงานสร้าง npm เพื่อโทรไปยังงานสร้าง 'npm run' อื่น ๆ .. สิ่งนี้กำลังได้รับความเจ็บปวด
Andrew T Finnell

141

หากคุณใช้สภาพแวดล้อมคล้าย UNIX ให้ใช้&เป็นตัวคั่น:

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

มิฉะนั้นหากคุณสนใจโซลูชันข้ามแพลตฟอร์มคุณสามารถใช้โมดูล npm-run-all :

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

14
ฉันทำสิ่งนี้เป็นครั้งคราวเมื่อฉัน "ctrl-c" npm คำสั่งยังคงอยู่ในพื้นหลัง ... ความคิดใด ๆ
Kamil Tomšík

13
a && bเริ่มต้นbหลังจากaเสร็จสิ้นเรียบร้อยแล้ว แต่ไม่มีการหยุดโดยไม่มีข้อผิดพลาดดังนั้นจึงไม่สามารถทำงานได้ a & bเริ่มaย้ายมันไปที่พื้นหลังและเริ่มbทันที ชนะ! a | bท่อ stdout ของaไปยัง stdin bซึ่งต้องทำงานทั้งสองพร้อมกัน แม้ว่าสิ่งนี้อาจดูเหมือนจะมีผลตามที่ต้องการ แต่คุณไม่ควรใช้ที่นี่
j2L4e

8
@ KamilTomšík &เป็นความคิดที่ไม่ดีจริงๆเพราะมันแยกกระบวนการ หมายความว่าnpmจะไม่เป็นกระบวนการหลักอีกต่อไป คุณจะจบลงด้วยผีดิบที่จะไม่ถูกฆ่าด้วยnpm run start-watch ctrl-c
ngryman

6
เพียงเพิ่มwaitเพื่อลดปัญหาที่เกิดขึ้นกับกระบวนการแขวน:"dev": "npm run start-watch & npm run wp-server & wait"
Ruslan Prokopchuk

2
มันไม่ใช่ซอมบี้ แต่&ในระบบปฏิบัติการยูนิกซ์ป้องกันคำสั่งจากการตอบสนองต่อ Cc / Cz และยังป้องกันการส่งคืนรหัสของมันจากการเผยแพร่ในกรณีที่มีความล้มเหลว
binki

77

จาก windows cmd คุณสามารถใช้start:

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

ทุกคำสั่งที่เปิดตัวด้วยวิธีนี้เริ่มต้นในหน้าต่างของตัวเอง


2
โซลูชั่นที่สมบูรณ์แบบ! ฉันชอบที่มันเปิดหน้าต่างใหม่ ยอดเยี่ยมสำหรับแพ็คเกจ VS2015 ความต้องการของผู้ใช้
TetraDev

13
สิ่งนี้ไม่ทำงานหากคุณมีงานเฝ้าดูเพราะ&&รอให้คำสั่งแรกเสร็จสิ้นก่อนที่จะเริ่มคำสั่งที่สองและงานเฝ้าดูจะไม่เสร็จสิ้น
Benny Neugebauer

2
@BennyNeugebauer คำสั่งถูกนำหน้าด้วยคำสั่ง "เริ่มต้น" ซึ่งจะเปิดบรรทัดคำสั่งใหม่สำหรับแต่ละคำสั่ง ฉันสับสนในตอนแรกเช่นกันเพราะฉันคิดว่า "การใช้ตัวดำเนินการ & จะไม่ทำงาน" วิธีนี้ง่ายมากและไม่ต้องใช้แพ็คเกจ / งานเพิ่มเติมจากผู้พัฒนา
แอดดิสัน

5
นี่เป็นสิ่งที่ผิด คำสั่งจะทำงานตามลำดับ บน Windows คุณต้องใช้ปลั๊กอินเพื่อเรียกใช้คำสั่งพร้อมกัน
zhekaus

1
นี่เป็น Windows โดยเฉพาะใช่ไหม
binki

62

คุณควรใช้npm-run-all (หรือconcurrently, parallelshell) เนื่องจากมีการควบคุมการเริ่มต้นและการฆ่าคำสั่งมากขึ้น ผู้ประกอบการ&, |มีความคิดที่ไม่ดีเพราะคุณจะต้องหยุดมันด้วยตนเองหลังจากการทดสอบทั้งหมดจะเสร็จสิ้น

นี่คือตัวอย่างสำหรับการทดสอบไม้โปรแทรกเตอร์ถึง 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 = เรียกใช้คำสั่งแบบขนาน

-r = ฆ่าคำสั่งทั้งหมดเมื่อหนึ่งในนั้นเสร็จสิ้นด้วยรหัสออกเป็นศูนย์

การรันnpm run testจะเริ่มต้นโปรแกรมควบคุม Selenium เริ่มเซิร์ฟเวอร์ http (เพื่อให้บริการไฟล์แก่คุณ) และเรียกใช้การทดสอบไม้โปรแทรกเตอร์ เมื่อการทดสอบทั้งหมดเสร็จสิ้นก็จะปิดเซิร์ฟเวอร์ http และไดรเวอร์ซีลีเนียม


3
ฉันสงสัยว่าวิธีนี้ทำงานได้อย่างถูกต้องสำหรับการทดสอบ ขณะที่ webdriver-start และ http-server สามารถทำงานพร้อมกันได้งาน protractor ควรรันหลังจากสองรายการแรกเท่านั้น
asenovm

@ asenovm สำหรับงานที่ต้องพึ่งพาคำสั่งซื้อทำไมไม่เพียง แต่ใช้gulpและgulp-sync?
r3wt

30

คุณสามารถใช้หนึ่ง&สคริปต์สำหรับรันขนาน

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

ลิงค์อ้างอิง


สิ่งนี้จะทำงานใน Windows หรือไม่ ขออภัยฉันยังใหม่กับโหนดและฉันไม่ทราบวิธีการยืนยัน!
Benison Sam

@BenisonSam ไม่ทำงานบน Mac แม้ว่า
shanehoban

25

ทางออกที่ดีกว่าคือการใช้ &

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

54
ไม่มันไม่ดีกว่าเพราะมันใช้งานไม่ได้กับทุกแพลตฟอร์ม
Stijn de Witt

ผมไม่ทราบว่า. แพลตฟอร์มใดที่ใช้งานไม่ได้ @Corey - อัปเดตคำตอบของคุณพร้อมกับคำเตือนเกี่ยวกับ inter-op และฉันจะ upvote คุณ
Ashley Coolman

8
&ใช้งานได้บน Windows แต่มันทำงานแตกต่างกัน บน OSX มันจะรันทั้งสองคำสั่งพร้อมกัน แต่บน Windows มันจะรันคำสั่งแรกและหลังจากที่มีคำสั่งแรกอยู่แล้วก็จะรันคำสั่งที่สอง
เทรเวอร์

3
ไม่มันไม่ได้แยกกระบวนการคุณจะไม่สามารถฆ่ามันในแบบง่าย ๆ
ngryman

2
@ngryman นั่นคือสิ่งที่ฉันคาดไว้ด้วย อย่างไรก็ตามฉันลองและทำขั้นตอนทั้งสาม (dev, start-watch และ wp-server) เมื่อคุณกด Ctrl + C
musicin3d

17

ฉันได้ตรวจสอบวิธีแก้ปัญหาเกือบทั้งหมดจากด้านบนและใช้เฉพาะnpm-run-allฉันสามารถแก้ไขปัญหาทั้งหมดได้ ประโยชน์หลักมากกว่าการแก้ปัญหาอื่น ๆ ทั้งหมดเป็นความสามารถในการเรียกใช้สคริปต์ที่มีการขัดแย้ง

{
  "test:static-server": "cross-env NODE_ENV=test node server/testsServer.js",
  "test:jest": "cross-env NODE_ENV=test jest",
  "test": "run-p test:static-server \"test:jest -- {*}\" --",
  "test:coverage": "npm run test -- --coverage",
  "test:watch": "npm run test -- --watchAll",
}

หมายเหตุrun-pเป็นทางลัดสำหรับnpm-run-all --parallel

npm run test:watch -- Somethingนี้จะช่วยให้ผมที่จะเรียกใช้คำสั่งที่มีการขัดแย้งเช่น

แก้ไข:

มีตัวเลือกที่มีประโยชน์อีกหนึ่งตัวเลือกสำหรับnpm-run-all:

 -r, --race   - - - - - - - Set the flag to kill all tasks when a task
                            finished with zero. This option is valid only
                            with 'parallel' option.

เพิ่ม-rที่คุณสคริปต์ที่จะฆ่าทุกกระบวนการเมื่อเสร็จสิ้นด้วยรหัสnpm-run-all 0สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อคุณเรียกใช้เซิร์ฟเวอร์ HTTP และสคริปต์อื่นที่ใช้เซิร์ฟเวอร์

  "test": "run-p -r test:static-server \"test:jest -- {*}\" --",

15

ฉันมีโซลูชันข้ามแพลตฟอร์มที่ไม่มีโมดูลเพิ่มเติมใด ๆวิธีการแก้ปัญหาโดยไม่ต้องข้ามแพลตฟอร์มโมดูลใดฉันกำลังมองหาบางอย่างเช่นลอง catch catch block ฉันสามารถใช้ได้ทั้งใน cmd.exe และทุบตี

การแก้ปัญหาคือcommand1 || command2สิ่งที่ดูเหมือนว่าจะทำงานในสภาพแวดล้อมทั้งสองเหมือนกัน ดังนั้นทางออกสำหรับ OP คือ:

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

จากนั้นnpm start(และnpm run dev) จะทำงานได้ง่ายบนแพลตฟอร์มทั้งหมด!


11

หากคุณแทนที่เครื่องหมายแอมเปอร์แซนด์คู่ด้วยแอมเปอร์แซนด์เดียวสคริปต์จะทำงานพร้อมกัน


แน่นอนมันง่ายและสง่างามไม่จำเป็นต้องพึ่งพาหรือเวทมนตร์อื่น ๆ
magikMaker

1
@Ginzburg เพราะมันใช้งานไม่ได้กับทุกแพลตฟอร์มเหมือนที่คุณเห็นในคำตอบอื่น ๆ
Jorge Fuentes González

6

โซลูชันด่วน

ในกรณีนี้ฉันจะบอกว่าทางออกที่ดีที่สุด หากสคริปต์นี้มีไว้สำหรับโมดูลส่วนบุคคลที่ตั้งใจให้ทำงานบนเครื่องที่ใช้ระบบ * nixเท่านั้นคุณสามารถใช้ตัวดำเนินการควบคุมสำหรับกระบวนการฟอร์กกิ้งซึ่งมีลักษณะดังนี้:&

ตัวอย่างของการทำสิ่งนี้ในไฟล์ package.json บางส่วน:

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

npm run serve-bundleแล้วคุณต้องการดำเนินการได้ทั้งในแบบคู่ขนานผ่าน คุณสามารถปรับปรุงสคริปต์เพื่อส่งออก pids ของกระบวนการ forked เป็นไฟล์ดังนี้:

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

สิ่งที่ Google ชอบตัวควบคุม bash สำหรับการฟอร์กเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับวิธีการทำงาน ฉันได้ให้บริบทเพิ่มเติมเกี่ยวกับการใช้ประโยชน์จากเทคนิค Unix ในโครงการโหนดด้านล่าง:

บริบทเพิ่มเติม RE: เครื่องมือ Unix & Node.js

หากคุณไม่ได้ใช้ Windows เครื่องมือ / เทคนิค Unix มักจะทำงานได้ดีเพื่อให้ได้สิ่งที่มีสคริปต์ Node เนื่องจาก:

  1. Node.js ส่วนใหญ่เลียนแบบหลักการของ Unix ด้วยความรัก
  2. คุณใช้ * nix (รวมถึง OS X) และ NPM กำลังใช้เชลล์อยู่ดี

โมดูลสำหรับงานระบบใน Nodeland นอกจากนี้ยังมักจะนามธรรมหรือใกล้เคียงของเครื่องมือที่ใช้ระบบปฏิบัติการยูนิกซ์จากไปfsstreams


1
ไม่เนื่องจาก&ผู้ให้บริการไม่รองรับ Windows
Stijn de Witt

3
@Stijnde ด้วยโพสต์ของฉันบอกว่า "ถ้าคุณไม่ได้ใช้ Windows ... " 0% ของคนที่ฉันทำงานด้วยซึ่งเป็นหนึ่งใน บริษัท เทคโนโลยีที่ใหญ่ที่สุดในโลกใช้ Node บน Windows ชัดเจนว่าโพสต์ของฉันยังคงมีคุณค่าสำหรับนักพัฒนาหลายคน
james_womack

2
มันเป็นวิธีการคิดแบบวงกลมใช่มั้ย หากคุณเขียนสคริปต์ npm ของคุณเช่นนี้คุณจะไม่สามารถใช้ Windows ได้เพราะจะไม่ทำงาน ดังนั้นจึงไม่มีใครใช้ Windows ดังนั้นจึงไม่สำคัญว่ามันจะไม่ทำงาน ... คุณต้องจบลงด้วยซอฟต์แวร์ที่ขึ้นกับแพลตฟอร์ม ตอนนี้ถ้าสิ่งที่ต้องทำนั้นยากมากที่จะทำข้ามแพลตฟอร์มได้มากกว่าที่จะเป็นการแลกเปลี่ยนที่ดี แต่ปัญหาตรงนี้เป็นเรื่องง่ายมากที่จะทำอย่างไรกับสคริปต์ NPM มาตรฐานเช่นที่เห็นพ้องกันและparallelshell
Stijn de Witt

2
@StijndeWitt ไม่มีเหตุผลของฉันเป็นวงกลม ฉันทำคำแถลงข้อเท็จจริงของความจริงว่าให้เหตุผล เรากำลังโพสต์เทคนิคทั่วไปสำหรับนักพัฒนาโหนดซึ่งหลายคนสร้างและปรับใช้บนเซิร์ฟเวอร์ Linux ใช่มันควรทำงานบน Windows หากเป็นสคริปต์ของ userland แต่สคริปต์ npm ส่วนใหญ่ใช้สำหรับการพัฒนาและการปรับใช้ - โดยส่วนใหญ่จะอยู่บนเครื่อง * nix เกี่ยวกับโมดูลที่คุณพูดถึงก) มันเป็นสิ่งที่ยืดยาวอย่างมากในการโทรพร้อมกันและขนานกัน "มาตรฐาน" (~ 1,500 ดาวน์โหลดต่อวันอยู่ไกลจากมาตรฐานใน NPMland) และ b) หากคุณต้องการซอฟต์แวร์เพิ่มเติมสำหรับกระบวนการแบบขนานคุณอาจใช้เช่นกัน อึก.
james_womack

@StijndeWitt ฉันขอขอบคุณที่ได้รับการตระหนักถึงโมดูลเหล่านั้นแม้ว่า - ขอบคุณ
james_womack


5

วิธีการเกี่ยวกับการฟอร์ก

อีกทางเลือกหนึ่งในการเรียกใช้สคริปต์หลายโหนดคือใช้สคริปต์ Node เดียวซึ่งสามารถแยกอื่น ๆ ได้ Forking ได้รับการสนับสนุนโดยกำเนิดใน Node ดังนั้นจึงไม่เพิ่มการพึ่งพาและข้ามแพลตฟอร์ม


ตัวอย่างที่น้อยที่สุด

นี่จะเรียกใช้สคริปต์ตามเดิมและถือว่าอยู่ในไดเรกทอรีของสคริปต์หลัก

// fork-minimal.js - run with: node fork-minimal.js

const childProcess = require('child_process');

let scripts = ['some-script.js', 'some-other-script.js'];
scripts.forEach(script => childProcess.fork(script));

ตัวอย่างที่ชัดเจน

สิ่งนี้จะรันสคริปต์ด้วยอาร์กิวเมนต์และกำหนดค่าโดยตัวเลือกที่มีอยู่มากมาย

// fork-verbose.js - run with: node fork-verbose.js

const childProcess = require('child_process');

let scripts = [
    {
        path: 'some-script.js',
        args: ['-some_arg', '/some_other_arg'],
        options: {cwd: './', env: {NODE_ENV: 'development'}}
    },    
    {
        path: 'some-other-script.js',
        args: ['-another_arg', '/yet_other_arg'],
        options: {cwd: '/some/where/else', env: {NODE_ENV: 'development'}}
    }
];

let processes = [];

scripts.forEach(script => {
    let runningScript = childProcess.fork(script.path, script.args, script.options);

   // Optionally attach event listeners to the script
   runningScript.on('close', () => console.log('Time to die...'))

    runningScripts.push(runningScript); // Keep a reference to the script for later use
});

การสื่อสารกับสคริปต์ที่แยกกัน

ฟอร์กกิ้งยังมีสิทธิประโยชน์เพิ่มเติมที่สคริปต์หลักสามารถรับเหตุการณ์จากกระบวนการลูกแยกและส่งกลับ ตัวอย่างทั่วไปสำหรับสคริปต์พาเรนต์เพื่อฆ่าชายด์ที่คดเคี้ยว

 runningScripts.forEach(runningScript => runningScript.kill());

สำหรับกิจกรรมและวิธีการเพิ่มเติมที่มีให้ดูChildProcessเอกสาร


3

ฉันพบปัญหาเกี่ยวกับ&และ|ซึ่งออกจากสถานะและการโยนข้อผิดพลาดตามลำดับ

โซลูชันอื่น ๆ ต้องการรันงานใด ๆ ที่มีชื่อที่กำหนดเช่น npm-run-all ซึ่งไม่ใช่กรณีการใช้งานของฉัน

ดังนั้นฉันจึงสร้างnpm-run-parallelที่รันสคริปต์ npm แบบอะซิงโครนัสและรายงานกลับเมื่อทำเสร็จ

ดังนั้นสำหรับสคริปต์ของคุณมันจะเป็น:

npm-run-parallel wp-server start-watch


2

ในกรณีของฉันฉันมีสองโครงการหนึ่งคือUIและอีกโครงการหนึ่งคือAPIและทั้งสองมีสคริปต์ของตัวเองในpackage.jsonไฟล์ที่เกี่ยวข้อง

ดังนั้นนี่คือสิ่งที่ฉันทำ

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

ชอบทางออกของคุณ นอกจากนี้ยังมีUI ( node app) และAPI (เชิงมุมในโฟลเดอร์ย่อยsrc , คาดเดาcd src/ng serve), เฉพาะส่วนแรกเท่านั้นที่ใช้งานได้ node app& cd src& ng serveเช่น
Jeb50


1

ฉันใช้npm-run-allมาระยะหนึ่งแล้ว แต่ก็ไม่เคยเข้ากันเลยเพราะเอาต์พุตของคำสั่งในโหมดดูทำงานได้ไม่ดี ตัวอย่างเช่นถ้าฉันเริ่มcreate-react-appและjestอยู่ในโหมดดูฉันจะสามารถเห็นผลลัพธ์จากคำสั่งสุดท้ายที่ฉันรันเท่านั้น ดังนั้นเวลาส่วนใหญ่ฉันใช้คำสั่งทั้งหมดของฉันด้วยตนเอง ...

นี่คือเหตุผลที่ผมใช้ lib ตัวเองของฉันทำงานหน้าจอ มันยังเป็นโครงการเล็กมาก (จากเมื่อวาน: p) แต่มันอาจจะคุ้มค่าที่จะดูมันในกรณีของคุณมันจะเป็น:

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

จากนั้นคุณกดปุ่มตัวเลข1เพื่อดูการส่งออกของwp-serverและกดเพื่อดูการส่งออกของ0start-watch


1

โซลูชันของฉันคล้ายกับ Piittis 'แม้ว่าฉันจะมีปัญหาในการใช้ Windows ดังนั้นฉันต้องตรวจสอบ win32

const { spawn } = require("child_process");

function logData(data) {
    console.info(`stdout: ${data}`);
}

function runProcess(target) {
    let command = "npm";
    if (process.platform === "win32") {
        command = "npm.cmd"; // I shit you not
    }
    const myProcess = spawn(command, ["run", target]); // npm run server

    myProcess.stdout.on("data", logData);
    myProcess.stderr.on("data", logData);
}

(() => {
    runProcess("server"); // package json script
    runProcess("client");
})();

0

สคริปต์โหนดแบบง่าย ๆ เพื่อให้คุณไปได้โดยไม่ยุ่งยากมากเกินไป การใช้ readline เพื่อรวมเอาท์พุทดังนั้นเส้นจึงไม่ยุ่งเหยิง

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);
});

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.