Chạy các kịch bản NPM tuần tự


149

Hãy nói tôi có

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

Lệnh NPM nào tôi có thể chạy để cho phép tất cả các tập lệnh này khởi chạy tuần tự. Khi tôi sử dụng sửa lỗi trước / sau, chúng khởi chạy tuần tự nhưng chúng không đợi tập lệnh gốc hoàn tất trước khi thực thi. Tôi giả sử giải pháp duy nhất là: Làm cách nào để các tác vụ Gulp bắn liên tiếp khi bắn các lệnh shell trong hàm trợ giúp async.series? ? Tôi biết điều này có thể được thực hiện với Gulp nhưng tôi muốn gắn bó với NPM ngay bây giờ để khám phá khả năng của nó. Cảm ơn vì bất kì sự giúp đỡ!


Câu trả lời được cập nhật ở phía dưới
Tzach Ovadia

Theo tài liệu Startlệnh, bạn sẽ có thể sử dụng /waittham số (Khởi động ứng dụng và đợi cho đến khi kết thúc)
Tzach Ovadia

Câu trả lời:


316

Gọi các tập lệnh này thông qua chạy npm và xâu chuỗi chúng với hai ký hiệu &&:

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

Giải trình:

  • Sử dụng &&(gấp đôi ký hiệu) để thực hiện tuần tự.
  • Sử dụng &(ký hiệu đơn) để thực hiện song song.

4
Điều này hoạt động tốt nhất bởi vì nó thực thi theo thứ tự, vì mỗi lệnh không thực thi cho đến khi hoàn thành các ưu tiên, như được yêu cầu trong OP. Cảm ơn
Gạo

20
&&được đánh giá bởi trình bao và không hoạt động trên Windows.
Bernhard Döbler

12
Đây không phải là câu trả lời được chấp nhận. Per @ BernhardDöbler, &&cú pháp là một cấu trúc UNIX. Nó sẽ hoạt động không chính xác trên các máy của Window, có khả năng gây hậu quả cho quá trình xây dựng của bạn.
Rafe Goldberg

3
@RafeGoldberg Toán tử && có hành vi thực thi giống nhau trong cả hai môi trường windows và * nix, tức là thực thi tuần tự..Không có gì chúng ta thiếu?
Cơm

3
@Rice oy vey; đã bị câm và trộn lẫn các toán tử đơn và đôi của tôi. Theo npm-run-alltài liệu: Đôi khi chúng tôi sử dụng &để chạy song song nhiều lệnh, nhưng Windows ' cmd.exe... không hỗ trợ [toán tử này]. Vì vậy, có vẻ như bạn đã đúng - ít nhất là từ nghiên cứu ngắn gọn của tôi, &&nhà điều hành dường như hoàn toàn tương thích đa nền tảng.
Rafe Goldberg

31

Theo câu trả lời tuyệt vời của @ Mobiletainment , bạn cũng có thể sử dụng npm-run-all để làm cho lệnh ngắn hơn và dễ đọc hơn nhiều. Trong trường hợp của bạn:

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

run-slà một phím tắt npm-run-allcung cấp, chạy tất cả các tập lệnh npm đã cho theo tuần tự, do đó -s( run-slà phiên bản ngắn hơn npm-run-all -s).


19

Bạn chỉ có thể xâu chuỗi chúng thành một kịch bản khác. "start": "pre-build && build_logic && post_build && exit"


2
Tôi sẽ yêu cầu họ đợi nhau kết thúc, những thứ này sẽ bắn ra liên tục nhưng sẽ không chờ đợi.
Gạo

2
Tôi không nghĩ rằng đây là một vấn đề nút / npm. Các startlệnh bạn đang thực hiện trong các cửa sổ về mặt kỹ thuật hoàn tất. Sử dụng /waitcờ với startđể buộc startứng dụng vẫn mở cho đến khi phương thức bên trong cũng kết thúc.
dvlsg

Để kiểm tra điều này - chạy start notepadtừ một dấu nhắc lệnh, sau đó hãy xem dấu nhắc lệnh ban đầu. Bạn sẽ có thể gõ vào một lệnh khác. Sau đó chạy start /wait notepad. Các startlệnh nên tiếp tục "chạy" trong khi cửa sổ notepad của bạn đang mở (hãy nhìn vào lệnh một lần nữa nhắc nhở). Sau đó, khi bạn đóng notepad, startsẽ hoàn thành.
dvlsg

Giải pháp \ Wait không hoạt động đối với các lệnh được nối thông qua các dấu kép và các lệnh npm cố định trước / sau.
Gạo

15

Bạn có thể tiền tố các tập lệnh của mình prepostvì vậy chúng sẽ tự động thực thi:

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

sau đó chạy npm run build


điều này không hoạt động, như được chỉ ra trong câu hỏi: "Khi tôi sử dụng sửa lỗi trước / sau, chúng khởi chạy tuần tự nhưng chúng không đợi tập lệnh gốc kết thúc trước khi thực thi."
Russell Chisholm

3

bạn co thể thử:


"scripts": {
  "clean-dist": "rm -f ./dist/*.js && rm -f ./dist/*.map",
  "build": "npm run clean-dist && parcel build ./packages/index.html"
},

2

Bạn có thể sử dụng npm-run-all để kết hợp nhiều lệnh theo nhiều cách khác nhau

Ví dụ: nếu bạn có các tập lệnh sau trong package.json:

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

Bạn có thể chạy tất cả chúng tuần tự như thế này:

$ npm-run-all clean lint build

Xem câu hỏi này để biết cách chạy song song nhiều lệnh npm


1
Đây là con đường để đi. npm-run-all là tốt nhất. Và sẽ tạo ra một gói.json là đa nền tảng.
Robert
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.