Последовательный запуск сценариев NPM

164

Скажем, у меня есть

"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параметр (Запустить приложение и дождаться его завершения)
Цах Овадия

Ответы:

337

Вызовите эти скрипты через npm run и соедините их двойным амперсандом &&:

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

Пояснение:

  • Используйте &&(двойной амперсанд) для последовательного выполнения.
  • Используйте &(одиночный амперсанд) для параллельного выполнения.
Мобайлдуд
источник
5
Это работает лучше всего, потому что он выполняется по порядку, так как каждая команда не выполняется до тех пор, пока не будут завершены предыдущие, как запрошено в OP. Спасибо
Райс
24
&&оцениваются оболочкой и не работают в Windows.
Бернхард Дёблер
13
Это не должен быть принятым ответом. Согласно @ BernhardDöbler, &&синтаксис является конструкцией UNIX. Он будет вести себя некорректно на компьютерах Windows, что может привести к серьезным последствиям для процесса сборки.
Rafe Goldberg
4
@RafeGoldberg Оператор && имеет одно и то же поведение выполнения как в среде Windows, так и в среде * nix, то есть последовательное выполнение .. Разве что-то нам не хватает?
Rice
4
@ Rice oy vey; был глупым и путал мои операторы с одним и двумя амперсандами. Согласно npm-run-allдокументации: «мы иногда используем &для параллельного выполнения нескольких команд, но Windows cmd.exe... не поддерживает [этот оператор]». Похоже, вы были правы - по крайней мере, из моего краткого исследования &&оператор кажется полностью совместимым с разными платформами.
Rafe Goldberg
36

Следуя отличному ответу @ 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).

Или А.
источник
20

Вы можете префикс скриптов 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

Цах Овадия
источник
это не работает, как указано в вопросе: «Когда я использую исправление до / после, они запускаются последовательно, но не дожидаются завершения родительского сценария перед выполнением».
Рассел
19

Вы можете просто вставить их в другой сценарий. "start": "pre-build && build_logic && post_build && exit"

Дэйв V
источник
2
Я бы попросил их дождаться завершения друг друга, они будут срабатывать последовательно, но не будут ждать.
Райс
2
Я не думаю, что это проблема node / npm. startКоманда , которую вы выполняете в окнах технически является законченной. Используйте /waitфлаг с, startчтобы заставить startприложение оставаться открытым до завершения внутреннего метода.
dvlsg
Чтобы проверить это - запустите start notepadиз командной строки, а затем посмотрите на исходную командную строку. Вы должны иметь возможность ввести другую команду. Тогда беги start /wait notepad. Команда startдолжна продолжать «работать», пока открыто окно блокнота (еще раз взгляните на командную строку). Затем, как только вы закроете блокнот, startвсе будет готово.
dvlsg
Решение \ wait не работает для команд, добавленных через двойной амперсанд, или фиксированных команд npm до / после.
Райс
5

можешь попробовать:


"scripts": {
  "clean-dist": "rm -f ./dist/*.js && rm -f ./dist/*.map",
  "build": "npm run clean-dist && parcel build ./packages/index.html"
},
Мухаммед Мусса
источник
4

Вы можете использовать npm-run-all для объединения нескольких команд множеством разных способов.

Например, если у вас были следующие скрипты в вашем package.json:

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

Вы можете запустить их все последовательно следующим образом:

$ npm-run-all clean lint build

См. Этот вопрос о том, как запускать несколько команд npm параллельно

KyleMit
источник
1
Это путь. npm-run-all лучший. И создаст кроссплатформенный package.json.
Роберт