我怎样才能"中止"一口气

Bri*_*ald 8 javascript node.js gulp

在我的gulp构建中,我想在我的服务器单元测试失败的情况下"中止"构建过程,但我不知道如何实现这一点.

目前,我正在使用node的request模块来运行一些服务器端单元测试,如下所示:

gulp.task("run-server-tests", function(){

    var serverTestUrl = "http://myurl"; // returns test results in json format

    request(serverTestUrl, function (error, response, body) {

        var responseData = JSON.parse(body);

        if(responseData.isSuccess){

            console.log(responseData.message);

            // nice! continue with rest of build (js, css tasks, etc.)

        }

        else {

            open(serverTestUrl + "&render"); // show unit test failures

            // err.... gulp.abortProcessing(); ????

        }

    });

});
Run Code Online (Sandbox Code Playgroud)

================================================== ============

**更新

在马丁和尼克的有用回应之后,我将我的构建剥离到最基本的例子,我可以想出两个建议,其中:

  1. 使用自动传递给任务函数的回调方法来中止构建,并且
  2. 使用promises中止构建

这是我更新的gulpfile.js:

var gulp = require("gulp");
var plugins = require('gulp-load-plugins')();
var Q = require("q");

gulp.task("task-1-option-1", function(callback){

    plugins.util.log("task 1 running");

    callback("unit test failed, stop build"); // let's just assume the unit tests fail

});

gulp.task("task-1-option-2", function(callback){

    plugins.util.log("task 1 running");

    var deferred = Q.defer();

    setTimeout(function(){

        deferred.reject("unit test failed, stop build"); // again, let's assume the unit tests fail

    }, 2000);

    return deferred.promise;

});

gulp.task("task-2-option-1", ["task-1-option-1"], function(){

    // if this runs, the build didn't abort as expected
    plugins.util.log("task 2 running");

});

gulp.task("task-2-option-2", ["task-1-option-2"], function(){

    // if this runs, the build didn't abort as expected
    plugins.util.log("task 2 running");

});


// trigger option-1 (Nick's suggestion)
gulp.task("option-1", ["task-1-option-1", "task-2-option-1"]);

// trigger option-2 (Martin's suggestion)
gulp.task("option-2", ["task-1-option-2", "task-2-option-2"]);
Run Code Online (Sandbox Code Playgroud)

================================================== ==============

问题在于,虽然这两种方法似乎都"中止"了构建,但它们都会导致gulp在终端中抛出"硬错误"(cygwin).我想知道这是不是因为我在Windows上运行这些测试,因为从我有限的经验来看,所有节点/ gulp似乎在Windows上为我打破了.

这是我为每项任务收到的​​输出.首先,回调选项:

$ gulp option-1
[10:45:32] Using gulpfile C:\users\bfitzgerald\desktop\gulp-test\gulpfile.js
[10:45:32] Starting 'task-1-option-1'...
[10:45:32] task 1 running
[10:45:32] 'task-1-option-1' errored after 79 ms
[10:45:32] Error: unit test failed, stop build
    at formatError (C:\Users\bfitzgerald\AppData\Roaming\npm\node_modules\gulp\bin\gulp.js:169:10)
    at Gulp.<anonymous> (C:\Users\bfitzgerald\AppData\Roaming\npm\node_modules\gulp\bin\gulp.js:195:15)
    at Gulp.emit (events.js:107:17)
    at Gulp.Orchestrator._emitTaskDone (C:\users\bfitzgerald\desktop\gulp-test\node_modules\gulp\node_modules\orchestrator\index.js:264:8)
    at C:\users\bfitzgerald\desktop\gulp-test\node_modules\gulp\node_modules\orchestrator\index.js:275:23
    at finish (C:\users\bfitzgerald\desktop\gulp-test\node_modules\gulp\node_modules\orchestrator\lib\runTask.js:21:8)
    at cb (C:\users\bfitzgerald\desktop\gulp-test\node_modules\gulp\node_modules\orchestrator\lib\runTask.js:29:3)
    at Gulp.<anonymous> (C:\users\bfitzgerald\desktop\gulp-test\gulpfile.js:9:2)
    at module.exports (C:\users\bfitzgerald\desktop\gulp-test\node_modules\gulp\node_modules\orchestrator\lib\runTask.js:34:7)
    at Gulp.Orchestrator._runTask (C:\users\bfitzgerald\desktop\gulp-test\node_modules\gulp\node_modules\orchestrator\index.js:273:3)
Run Code Online (Sandbox Code Playgroud)

这是promises选项的输出:

$ gulp option-2
[10:46:50] Using gulpfile C:\users\bfitzgerald\desktop\gulp-test\gulpfile.js
[10:46:50] Starting 'task-1-option-2'...
[10:46:50] task 1 running
[10:46:52] 'task-1-option-2' errored after 2.08 s
[10:46:52] Error: unit test failed, stop build
    at formatError (C:\Users\bfitzgerald\AppData\Roaming\npm\node_modules\gulp\bin\gulp.js:169:10)
    at Gulp.<anonymous> (C:\Users\bfitzgerald\AppData\Roaming\npm\node_modules\gulp\bin\gulp.js:195:15)
    at Gulp.emit (events.js:107:17)
    at Gulp.Orchestrator._emitTaskDone (C:\users\bfitzgerald\desktop\gulp-test\node_modules\gulp\node_modules\orchestrator\index.js:264:8)
    at C:\users\bfitzgerald\desktop\gulp-test\node_modules\gulp\node_modules\orchestrator\index.js:275:23
    at finish (C:\users\bfitzgerald\desktop\gulp-test\node_modules\gulp\node_modules\orchestrator\lib\runTask.js:21:8)
    at C:\users\bfitzgerald\desktop\gulp-test\node_modules\gulp\node_modules\orchestrator\lib\runTask.js:45:4
    at _rejected (C:\users\bfitzgerald\desktop\gulp-test\node_modules\q\q.js:804:24)
    at C:\users\bfitzgerald\desktop\gulp-test\node_modules\q\q.js:830:30
    at Promise.when (C:\users\bfitzgerald\desktop\gulp-test\node_modules\q\q.js:1064:31)
Run Code Online (Sandbox Code Playgroud)

所以这些建议似乎是正确的,因为它们阻止了第二个任务的运行,但是因为gulp正在掀起某种硬错误,所以仍然有些错误.任何人都可以为我阐明这一点吗?

Nic*_*lin 5

我不太确定我理解你试图用你的测试 url 完成什么,但是你可以调用传递给你的任务的回调函数,并使用非空值让它中止任务并发出通知:

gulp.task("run-server-tests", function(callback) {
    var serverTestUrl = "http://myurl";

    request(serverTestUrl, function (error, response, body) {
    var responseData = JSON.parse(body);

    if (responseData.isSuccess) {
         // snip...
         callback();
    } else {
        open(serverTestUrl + "&render"); // show unit test failures
        callback('Unit test error');
    }
  });
});
Run Code Online (Sandbox Code Playgroud)

吞咽文档