Выполнение нескольких команд для теста npm
В настоящее время я использую задачу gulp для тестирования проекта. Это запускает задачи, используя следующие инструменты:
- Карма (асинхронный)
- Транспортир (порожденный процесс)
- ESlint (используя
gulp-eslint
)
- HTMLHint (с помощью
gulp-htmlhint
)
- Stylelint (с помощью
gulp-postcss
)
Задача завершается с ошибкой, если какая-либо из этих задач не удалась.
Все эти инструменты имеют превосходные интерфейсы cli. Поэтому я решил, что я хочу запустить эти инструменты с помощью теста npm script.
Чтобы упростить, пусть все инструменты запускаются путем простого вызова их без каких-либо флагов. Затем это можно сделать, используя:
{
...
"scripts": {
"test": "karma && protractor && eslint && htmlhint && stylelint"
},
...
}
Однако это означает, что если karma
не выполняется, ни один из других инструментов не будет запущен.
Можно ли создать установку, в которой все эти инструменты будут запущены, но npm test
не удастся, если какая-либо из команд не удалась?
Ответы
Ответ 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 будет обрабатывать связанные с ОС вещи, такие как шаблоны глобирования, несовместимость переменных окружения и т.д.
Используйте примеры из оглавления о том, как это реализовать.