Подтвердить что ты не робот

Выполнение нескольких команд для теста npm

В настоящее время я использую задачу gulp для тестирования проекта. Это запускает задачи, используя следующие инструменты:

  • Карма (асинхронный)
  • Транспортир (порожденный процесс)
  • ESlint (используя gulp-eslint)
  • HTMLHint (с помощью gulp-htmlhint)
  • Stylelint (с помощью gulp-postcss)

Задача завершается с ошибкой, если какая-либо из этих задач не удалась.

Все эти инструменты имеют превосходные интерфейсы cli. Поэтому я решил, что я хочу запустить эти инструменты с помощью теста npm script.

Чтобы упростить, пусть все инструменты запускаются путем простого вызова их без каких-либо флагов. Затем это можно сделать, используя:

{
  ...
  "scripts": {
    "test": "karma && protractor && eslint && htmlhint && stylelint"
  },
  ...
}

Однако это означает, что если karma не выполняется, ни один из других инструментов не будет запущен.

Можно ли создать установку, в которой все эти инструменты будут запущены, но npm test не удастся, если какая-либо из команд не удалась?

4b9b3361

Ответ 1

npm-run-all также может справиться с этим

Вы можете запускать несколько команд npm одновременно, продолжая при ошибке следующим образом:

npm-run-all --parallel --continue-on-error karma protractor eslint htmlhint stylelint

Опции, как написано в документации:

-p, --parallel <tasks>   - Run a group of tasks in parallel.
                           e.g. 'npm-run-all -p foo bar' is similar to
                                'npm run foo & npm run bar'.
-c, --continue-on-error  - Set the flag to continue executing other tasks
                           even if a task threw an error. 'run-p' itself
                           will exit with non-zero code if one or more tasks
                           threw error(s).

Ответ 2

Теги скриптов в package.json запускаются вашей оболочкой, поэтому вы можете запустить команду, которую вы хотите запустить:

"scripts": {
  "test": "karma ; protractor ; eslint ; htmlhint ; stylelint"
},

Запустит все команды, если у вас есть оболочка unix/OSX.

Чтобы иметь возможность сохранить код exit_code, как вы указываете, для запуска команд необходимо иметь отдельный script. Может быть, что-то вроде этого:

#!/bin/bash

EXIT_STATUS=0

function check_command {
    "[email protected]"
    local STATUS=$?
    if [ $STATUS -ne 0 ]; then
        echo "error with $1 ($STATUS)" >&2
        EXIT_STATUS=$STATUS
    fi
}

check_command karma
check_command protractor
check_command eslint
check_command htmlhint
check_command stylelint
exit $EXIT_STATUS

Ответ 3

concurrently - хорошая библиотека, которая может справиться с этим. Он может быть установлен из npm.

npm install --save-dev concurrently

Когда каждый раздел сортируется как отдельный script, секция сценариев package.json выглядит примерно так:

{
  ...
  "scripts": {
    "test": "concurrently 'npm run karma' 'npm run protractor' 'npm run eslint' 'npm run htmlhint' 'npm run stylelint'",
    "karma": "karma start --single-run",
    "protractor": "protractor",
    "eslint": "eslint .",
    "htmlhint": "htmlhint 'app/**/*.html'",
    "stylelint": "stylelint 'app/**/*.css'",
  },
  ...
}

Ответ 4

Вы можете использовать такой инструмент, как script-launcher, чтобы расширить возможности вашего файла package.json.

С помощью script-launcher вы можете использовать массивы в качестве сценариев, запускать сценарии одновременно и многое другое.

Пример использования массивов сценариев и параллелизма

{
  "scripts": {
    "lint": [
      [
        "karma",
        "protractor",
        "eslint",
        "htmlhint",
        "stylelint"
      ],
      "echo All test were successful."
    ],
    "karma": "echo karma start --single-run",
    "protractor": "echo protractor",
    "eslint": "echo eslint .",
    "htmlhint": "echo htmlhint 'app/**/*.html'",
    "stylelint": "echo stylelint 'app/**/*.css'"
  }
}

Это также будет работать в Windows. script-launcher будет обрабатывать связанные с ОС вещи, такие как шаблоны глобирования, несовместимость переменных окружения и т.д.

Используйте примеры из оглавления о том, как это реализовать.