NPM запускает параллельную задачу, но ждет, пока ресурс будет доступен для запуска второй задачи



В npm, как я могу запустить две или более параллельных задач, но ждать, пока ресурс, который будет создан первой задачей, будет доступен для второй задачи, чтобы использовать его, и так далее?



Пример (концептуальный):



npm run task1 & waitfor task1 then task2 & waitFor task3 then task4 ...


Есть идеи?



EDIT



В качестве примера: предположим, что моя первая задача-запуск веб-сервера, а моя вторая задача-потребление данных с этого веб-сервера каждый раз, когда происходит событие. Другой пример: моей первой задачей может быть запуск webdriver-manager, моя вторая задача, запуск веб-сервера, и моя третья задача, запуск тестов e2e каждый раз, когда мои файлы изменяются. Поэтому мне нужно, чтобы все эти задачи выполнялись одновременно, но они должны быть инициализированы в определенном порядке и в определенное время.

592   2  

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, используя пример выше...

  1. первоначально выполняется task1.
  2. Когда task1 успешно завершит (то есть task1 завершит работу со статусом ноль), то task2 будет запущен.
  3. Когда 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

Решение, основанное на следующем обновлении/редактировании ОП:

Другой пример: моей первой задачей может быть запуск webdriver-manager, моя вторая задача, запуск веб-сервера, и моя третья задача, запуск тестов e2e каждый раз, когда мои файлы изменяются. Поэтому мне нужно, чтобы все эти задачи выполнялись одновременно, но они должны быть инициализированы в определенном порядке и в определенное время.

[51]}5. Выполнение задач одновременно.

Одновременно можно использовать для одновременного выполнения задач:

$ npm i -D concurrently

Псевдо пример использования concurrently:

"scripts": {
    "foo":  "concurrently \"npm run task1\" \"npm run task2\" \"npm run task3\""
},

Этот пример сохранит все задачи (1,2 и 3) выполняются одновременно и запускаются в указанном порядке. Я не знаю достаточно подробно инструментов, упомянутых в вашем примере использования, однако все примеры, приведенные в этой статье, могут быть объединены по мере необходимости, чтобы удовлетворить ваши точные требования.

concurrently также имеет несколько полезных опций .

Comments

    Ничего не найдено.