Запуск сценаріїв 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, щоб вивчити його можливості. Дякуємо за будь-яку допомогу!


Оновлена ​​відповідь внизу
Цач Овадія

Відповідно до документації Startкоманди, ви повинні мати можливість використовувати /waitпараметр (Запустити програму та дочекатися її завершення)
Tzach Ovadia

Відповіді:


316

Викликайте ці сценарії через npm run та ланцюжком їх з подвійним амперсом і &&:

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

Пояснення:

  • Використовуйте &&(подвійний амперсанд) для послідовного виконання.
  • Використовуйте &(одиночний амперсанд) для паралельного виконання.

4
Це найкраще працює, тому що воно виконується в порядку, оскільки кожна команда не виконує доти, доки не завершиться попередня програма, як вимагається в ОП. Спасибі
Райс

20
&&оцінюються оболонкою і не працюють в Windows.
Бернхард Деблер

12
Це не повинно бути прийнятою відповіддю. Пер @ BernhardDöbler, &&синтаксис - це конструкція UNIX. Він поводитиметься неправильно на машинах Window, що може призвести до негативних наслідків для вашого процесу збирання.
Рейф Гольдберг

3
@RafeGoldberg Оператор && має однакову поведінку в обох системах Windows і * nix, тобто послідовне виконання. Якщо тільки нам щось не вистачає?
Райс

3
@ Rice oy vey; був німим і змішував моїх операторів одиночного та подвійного амперсанда. За npm-run-allдокументами: "ми іноді використовуємо &паралельно запуск декількох команд, але Windows" cmd.exe... не підтримує [цього оператора]. " Тож, здавалося б, ви праві - принаймні з мого короткого дослідження, &&оператор здається ідеально сумісним між платформами.
Рейф Гольдберг,

31

Слідом за чудовою відповіддю @ Mobiletainment , ви також можете використовувати npm-run-all, щоб зробити команду набагато коротшою та значно читабельнішою. У вашому випадку:

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

run-s- це ярлик npm-run-all, який забезпечує, що всі задані npm-скрипти виконуються послідовно, отже, -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Команда повинна продовжувати «Виконати» в той час як ваше вікно блокнота відкрито (зверніть увагу на командний рядок знову). Потім, коли ви закриєте блокнот, startбуде закінчено.
dvlsg

Рішення \ wait не працює для команд, доданих за допомогою подвійного амперсанда або попередньо / після фіксованих команд npm.
Райс

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


це не працює, як зазначено в запитанні: "Коли я використовую фіксацію до / пост, вони запускаються послідовно, але вони не чекають, коли батьківський сценарій завершиться перед виконанням".
Рассел

3

Ви можете спробувати:


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

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 - все найкраще. І створить package.json, який є крос-платформним.
Роберт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.