【问题标题】:Gulp 4: how to detect the "Did you forget to signal async completion?" error in a complex build scriptGulp 4:如何检测“您是否忘记发出异步完成信号?”复杂构建脚本中的错误
【发布时间】:2018-05-10 13:41:15
【问题描述】:

迁移到 Gulp 4 的人可能知道,gulp.series - 理应如此 - 如果系列中的任务未正确发出完成信号,则不会继续执行。

我的问题是它处理这种错误的方式——它只是控制台中的一条消息(你忘记发出异步完成信号了吗?); gulp 仍然以错误代码 0 退出。这意味着如果您在更复杂的构建脚本中运行 gulp,对于该脚本来说,看起来一切正常,并且 gulp 任务成功完成,但显然没有。 (相比之下,如果您使用gulpUtil.plugin error 抛出错误,则会产生非0 错误代码。)

所以我的问题是:您如何“从外部”检测到发生了此类错误?

  • 在这种情况下,有没有办法让 gulp 以非 0 退出? (是否有我可以订阅并引发错误的事件,或者我可以设置的配置等)
  • 我是否应该尝试检查应该生成的资产是否存在? (我发现这个解决方案非常脆弱。)
  • 我是否应该“观察”控制台消息并查找特定字符串,例如“您忘记发出信号...”吗? (啊!)
  • (是的,我知道我可以用 gulp 完成所有操作,然后我就不需要检查错误代码,但我们假设实际上我做不到。)

还有其他我没有想到的可能性吗?

【问题讨论】:

    标签: terminal gulp error-code gulp-4


    【解决方案1】:

    您可以使用流/Promise/callback 来向进程发出信号。握手完成后,您可以继续该过程。

    var print = require('gulp-print');
    
    gulp.task('message', function() {
      return gulp.src('package.json')
        .pipe(print(function() { return 'HTTP Server Started'; }));
    });
    
    gulp.task('message', function() { 
      return new Promise(function(resolve, reject) {
        console.log("HTTP Server Started");
        resolve();
      });
    });
    
    gulp.task('message', function(done) {
      console.log("HTTP Server Started");
      done();
    });
    

    否则以这种方式使用回调。

    function syncTasks(callback1)
    {
        return gulp.series(firstTask, secondTask, (callback2) =>
        {
            callback1();
            callback2();
        })();    
    }
    

    【讨论】:

    • 感谢您的详细解答!但是,这并不能真正回答我的问题 :) 我知道异步完成在 gulp 4 中的工作原理以及任务 应该 的行为方式。我需要的是一种在 gulp 之外检测进程是否由于行为不端的任务而停止的方法。如果任务抛出错误,gulp 会以非 0 错误代码退出——这很容易处理!然而,异步完成错误使 gulp 以 0 退出 - 使其难以检测和处理。显然,最好尽可能避免这个错误——使用你提到的方法——但事情仍然可能出错,我想处理它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多