การเรียกใช้สคริปต์ NPM ตามลำดับ


150

สมมติว่าฉันมี

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

ฉันสามารถเรียกใช้คำสั่ง NPM ใดเพื่อให้สคริปต์ทั้งหมดเหล่านี้เปิดตามลำดับ เมื่อฉันใช้การแก้ไขล่วงหน้า / โพสต์พวกเขาจะเปิดตัวตามลำดับ แต่พวกเขาไม่รอให้สคริปต์หลักดำเนินการให้เสร็จก่อนที่จะดำเนินการ ฉันสมมติว่าวิธีแก้ปัญหาเดียวคือ: ฉันจะได้รับงาน Gulp เพื่อดำเนินการตามลำดับเมื่อยิงคำสั่งเชลล์ในฟังก์ชันผู้ช่วย async.series ได้อย่างไร ? ฉันรู้ว่าสิ่งนี้สามารถทำได้ด้วย Gulp แต่ตอนนี้ฉันอยากจะติดกับ NPM เพื่อสำรวจความสามารถของมัน ขอบคุณสำหรับความช่วยเหลือใด ๆ !


อัปเดตคำตอบที่ด้านล่าง
Tzach Ovadia

ตามเอกสารStartคำสั่งคุณควรจะสามารถใช้/waitพารามิเตอร์ (เริ่มแอปพลิเคชันและรอให้มันยุติ)
Tzach Ovadia

คำตอบ:


316

เรียกใช้สคริปต์เหล่านี้ผ่านการเรียกใช้ npm และโยงกับเครื่องหมายและคู่&&:

npm run pre-build && npm run build_logic && npm run post_build && npm run exit

คำอธิบาย:

  • ใช้&&(เครื่องหมายแอมเปอร์แซนด์คู่) สำหรับการประมวลผลตามลำดับ
  • ใช้&(เครื่องหมายแอมเปอร์แซนด์เดียว) สำหรับการประมวลผลแบบขนาน

4
วิธีนี้ใช้งานได้ดีที่สุดเพราะมันดำเนินการตามลำดับเนื่องจากแต่ละคำสั่งจะไม่ทำงานจนกว่าจะเสร็จสิ้นไฟล์เพลงตามที่ร้องขอใน OP ขอบคุณ
ข้าว

20
&&ถูกประเมินโดยเชลล์และไม่ทำงานบน Windows
Bernhard Döbler

12
นี่ไม่ควรเป็นคำตอบที่ยอมรับได้ ตาม @ BernhardDöbler &&ไวยากรณ์คือโครงสร้างของ UNIX มันจะทำงานผิดพลาดในเครื่องของ Window โดยอาจส่งผลเสียต่อกระบวนการสร้างของคุณ
Rafe Goldberg

3
@RafeGoldberg ตัวดำเนินการ && มีพฤติกรรมการดำเนินการเหมือนกันทั้งในสภาพแวดล้อม windows และ * nix นั่นคือการดำเนินการตามลำดับ .. เว้นแต่จะมีบางสิ่งที่เราขาดหายไปทั้งหมด
ข้าว

3
@ ข้าว oy vey; เป็นคนโง่และมั่วสุมผู้ประกอบการเดี่ยวและคู่ของฉัน ตามnpm-run-allเอกสาร:“ บางครั้งเราใช้&เพื่อเรียกใช้หลายคำสั่งพร้อมกัน แต่ Windows ' cmd.exe... ไม่สนับสนุน [ตัวดำเนินการนี้]” ดังนั้นมันจึงดูเหมือนว่าคุณพูดถูก - อย่างน้อยจากการวิจัยสั้น ๆ ของฉัน&&ผู้ประกอบการดูเหมือนว่าเข้ากันได้อย่างสมบูรณ์แบบข้ามแพลตฟอร์ม
Rafe Goldberg

31

การปฏิบัติตามคำตอบที่ยอดเยี่ยมของ @ Mobiletainment คุณสามารถใช้npm-run-allเพื่อทำให้คำสั่งสั้นลงและอ่านได้มากขึ้น ในกรณีของคุณ:

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

run-sเป็นทางลัดที่npm-run-allให้ซึ่งรันสคริปต์ npm ที่กำหนดทั้งหมดตามลำดับดังนั้น the -s( run-sเป็นเวอร์ชันที่สั้นกว่าnpm-run-all -s)


19

คุณสามารถเอามันไปไว้ในสคริปต์อื่นได้ "start": "pre-build && build_logic && post_build && exit"


2
ฉันต้องการให้พวกเขารอให้แต่ละอื่น ๆ เสร็จสิ้นสิ่งเหล่านี้จะดับไปตามลำดับ แต่จะไม่รอ
ข้าว

2
ฉันไม่คิดว่านี่เป็นปัญหาโหนด / npm startคำสั่งที่คุณกำลังดำเนินการในหน้าต่างทางเทคนิคจะเสร็จสิ้น ใช้การ/waitตั้งค่าสถานะด้วยstartเพื่อบังคับให้startแอปพลิเคชันยังคงเปิดอยู่จนกว่าวิธีการภายในจะเสร็จสิ้น
dvlsg

เพื่อทดสอบสิ่งนี้ - เรียกใช้start notepadจากพรอมต์คำสั่งจากนั้นดูที่พรอมต์คำสั่งดั้งเดิม คุณควรจะสามารถพิมพ์คำสั่งอื่นได้ start /wait notepadจากนั้นเรียก startคำสั่งควรดำเนินการต่อไป "รัน" ในขณะที่หน้าต่าง Notepad ของคุณจะเปิด (ดูที่คำสั่งพรอมต์อีกครั้ง) จากนั้นเมื่อคุณปิดแผ่นจดบันทึกstartจะเสร็จสิ้น
dvlsg

โซลูชัน \ wait ไม่ทำงานสำหรับคำสั่งที่ผนวกผ่าน double ampersand หรือ pre / post fixed npm command
ข้าว

15

คุณสามารถนำหน้าสคริปต์ของคุณpreและpostเพื่อให้สคริปต์ทำงานโดยอัตโนมัติ:

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

จากนั้นเรียกใช้ npm run build


สิ่งนี้ใช้ไม่ได้ตามที่ระบุในคำถาม: "เมื่อฉันใช้การแก้ไขล่วงหน้า / โพสต์พวกเขาจะเริ่มทำงานตามลำดับ แต่พวกเขาไม่รอให้สคริปต์แม่ดำเนินการให้เสร็จก่อนดำเนินการ"
รัสเซลชิสโฮล์ม


2

คุณสามารถใช้npm-run-allเพื่อรวมหลายคำสั่งเข้าด้วยกันในหลากหลายวิธี

ตัวอย่างเช่นหากคุณมีสคริปต์ต่อไปนี้ในpackage.json:

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

คุณสามารถเรียกใช้ทั้งหมดตามลำดับดังนี้:

$ npm-run-all clean lint build

ดูคำถามนี้สำหรับวิธีรันหลายคำสั่ง npm ในแบบคู่ขนาน


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