NPM запускает параллельную задачу, но ждет, пока ресурс будет доступен для запуска второй задачи
В npm, как я могу запустить две или более параллельных задач, но ждать, пока ресурс, который будет создан первой задачей, будет доступен для второй задачи, чтобы использовать его, и так далее?
Пример (концептуальный):
npm run task1 & waitfor task1 then task2 & waitFor task3 then task4 ...
Есть идеи?
EDIT
В качестве примера: предположим, что моя первая задача-запуск веб-сервера, а моя вторая задача-потребление данных с этого веб-сервера каждый раз, когда происходит событие. Другой пример: моей первой задачей может быть запуск webdriver-manager, моя вторая задача, запуск веб-сервера, и моя третья задача, запуск тестов e2e каждый раз, когда мои файлы изменяются. Поэтому мне нужно, чтобы все эти задачи выполнялись одновременно, но они должны быть инициализированы в определенном порядке и в определенное время.
2 ответов:
Вы можете попробовать одновременно с пакетом wait-on для управления конкурентными/последовательными сценариями и выходами. ожидание последовательные запуски поддерживают статус ответа головы, прослушивание tcp,...
Например:
"scripts": { "start": "concurrently -k -n \"DB,API,WEB\" -c \"blue,magenta,yellow\" \"npm run start-db\" \"npm run start-api\" \"npm run start-web\"", "start-db": "myDbServerCmd", "start-api": "wait-on tcp:27017 && myApiServerCmd", "start-web": "myFrontServerCmd", }Спасибо dchambers за идею (source ).
Я не уверен, что полностью понимаю ваши требования, поэтому приведу несколько возможных решений.
возможно, вы хотите выполнять задачи последовательно (первое решение ниже), однако в своем посте вы упоминаете параллель.
[51]}1. Выполнение задач последовательно
npm-scriptsподдерживает оператор&&, который обычно используется в оболочках bash. Однако оператор&&, используемый вnpm-scripts, успешно работает на кросс-платформе.Псевдо пример использования оператора
&&для задач сцепления:"scripts": { "foo": "npm run task1 && npm run task2 && npm run task3" },Запуск
$ npm run fooчерез ваш CLI, используя пример выше...
- первоначально выполняется
task1.- Когда
task1успешно завершит (то естьtask1завершит работу со статусом ноль), тоtask2будет запущен.- Когда
task2успешно завершится, тоtask3будет запущен.Если левая сторона оператора
&&по какой-либо причине выходит из строя, (т. е. он выходит с ненулевым code / status) , последующие задачи на правой стороне не будут выполняться. Например, еслиtask1терпит неудачу, тоtask2иtask3не будут выполняться.
[51]}2. Одновременное выполнение задач
npm-scriptsтакже поддерживается кросс-платформа единого оператора&для одновременного выполнения задач.Псевдо пример с использованием оператора
&:"scripts": { "foo": "npm run task1 & npm run task2 & npm run task3" },В этом примере основное различие между двойным
&&и одиночным&оператором состоит в том, что если левая сторона одиночного&терпит неудачу, тогда правая сторона бежит независимо. Например, еслиtask1терпит неудачу, тоtask2все еще работает.
[51]}3. Выполнение задач параллельно.Для параллельного выполнения задач я рекомендую использовать parallelshell :
$ npm i -D parallelshellПсевдо пример использования
parallelshell:"scripts": { "foo": "parallelshell \"npm run task1\" \"npm run task2\" \"npm run task3\"" },Этот пример изначально кажется очень похожим на использование одного оператора
&, показанного в предыдущем разделе, однако он предлагает дополнительные преимущества, перечисленные в документации . Главным преимуществом (IMO) является:Если command1 или command2 выходят с ненулевым кодом выхода, то это не повлияет на результат вашей оболочки (т. е. они могут потерпеть неудачу и npm/bash/whatever проигнорирует ее). parallelshell не проигнорирует его и выйдет с первым ненулевым кодом выхода.
[51]}4. Выполнение задач параллельно и последовательно.Допустим, вы хотите запустить
task1иtask2параллельно / одновременно, а затем запуститьtask3только тогда, когда обаtask1иtask2успешно завершены.Для достижения этого вы можете использовать как
parallelshell, так и встроенный&&оператор.Псевдо пример использования
parallelshellи оператора&&для задач сцепления:"scripts": { "foo": "parallelshell \"npm run task1\" \"npm run task2\" && npm run task3" },
EDIT
Решение, основанное на следующем обновлении/редактировании ОП:
[51]}5. Выполнение задач одновременно.Другой пример: моей первой задачей может быть запуск webdriver-manager, моя вторая задача, запуск веб-сервера, и моя третья задача, запуск тестов e2e каждый раз, когда мои файлы изменяются. Поэтому мне нужно, чтобы все эти задачи выполнялись одновременно, но они должны быть инициализированы в определенном порядке и в определенное время.
Одновременно можно использовать для одновременного выполнения задач:
$ npm i -D concurrentlyПсевдо пример использования
concurrently:"scripts": { "foo": "concurrently \"npm run task1\" \"npm run task2\" \"npm run task3\"" },Этот пример сохранит все задачи (1,2 и 3) выполняются одновременно и запускаются в указанном порядке. Я не знаю достаточно подробно инструментов, упомянутых в вашем примере использования, однако все примеры, приведенные в этой статье, могут быть объединены по мере необходимости, чтобы удовлетворить ваши точные требования.
Comments