为npm测试运行多个命令

时间:2016-02-26 10:42:12

标签: node.js npm

我目前正在使用gulp任务来测试项目。这使用以下工具运行任务:

  • Karma(async)
  • 量角器(衍生过程)
  • ESlint(使用gulp-eslint
  • HTMLHint(使用gulp-htmlhint
  • Stylelint(使用gulp-postcss

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

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

简单地说,只需在没有任何标志的情况下调用它们就可以运行所有工具。然后可以使用以下方法完成:

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

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

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

4 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:8)

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 :(得分:7)

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

npm install --save-dev concurrently

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

答案 3 :(得分:0)

您可以使用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 将处理与操作系统相关的内容,例如遍历模式和环境变量不兼容等。

使用Table of Contents中的示例来了解如何实现此功能。