为npmtesting运行多个命令

我正在使用一个吞咽任务来testing一个项目。 这使用以下工具运行任务:

  • 噶(asynchronous)
  • 量angular器(产生的过程)
  • ESlint(使用gulp-eslint
  • HTMLHint(使用gulp-htmlhint
  • Stylelint(使用gulp-postcss

如果任何这些任务失败,任务将失败。

所有这些工具都有完美的cli接口。 所以我决定使用npmtesting脚本来运行这些工具。

简单地说,让所有工具通过简单地调用它们而没有任何标志来运行。 那么这可以使用:

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

但是,这意味着如果karma失败,其他工具都不会运行。

是否有可能创build一个所有这些工具都可以运行的设置,但是如果任何命令失败, npm test将会失败?

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. eg '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). 

package.json中的脚本标记由您的shell运行,因此您可以运行您希望shell运行的命令:

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

如果你有一个unix / OSX shell,将运行所有的命令。

为了能够像指定一样保留exit_code,您需要有一个单独的脚本来运行这些命令。 也许这样的事情:

 #!/bin/bash EXIT_STATUS=0 function check_command { "$@" 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 

同时是一个很好的库,可以处理这个问题。 它可以从npm安装。

 npm install --save-dev concurrently 

当每个部分被作为单独的脚本sorting时, 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'", }, ... }