我怎么能中止"一口气

时间:2015-02-16 04:19:15

标签: javascript node.js gulp

在我的gulp构建中,我想" abort"如果我的服务器单元测试失败但是我不确定如何实现这一点的构建过程。

目前,我正在使用节点的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(); ????

        }

    });

});

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

**更新

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

  1. 使用自动传递给任务函数的回调方法来中止构建,
  2. 使用promises中止构建
  3. 这是我更新的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"]);
    

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

    问题在于,虽然这两种方法似乎都在中止"在构建中,它们都会导致吞吐出一个"硬错误"在终端(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)
    

    以下是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)
    

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

3 个答案:

答案 0 :(得分:3)

我不太确定我理解您要使用测试网址尝试完成的内容,但是您可以使用非null来调用传递到任务中的回调,以使其通过通知中止任务:

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');
    }
  });
});

gulp docs

答案 1 :(得分:2)

gulp任务可以返回一个承诺,表明正在进行某些异步工作。

如果您拒绝承诺,它将中止进一步处理。

在您当前的代码中,您没有告诉我们异步工作,因此无法取消。

答案 2 :(得分:2)

调用回调或拒绝延迟时,不要传递字符串参数,而是传递new Error('error msg')。这将停止构建并为刚刚创建的错误打印堆栈跟踪。

为了在管理任务时处理来自第三方插件的错误,我建议您阅读这篇很棒的文章:http://www.artandlogic.com/blog/2014/05/error-handling-in-gulp/

另外,要获得色彩鲜艳的日志消息,请尝试使用gulp-utils中的colors实用程序。像plugins.util.log(plugins.util.colors.bgRed.white('unit test failed, stop build');之类的东西会打印出带有红色背景和白色文本的消息。在终端上更容易发现。