Gulp 4:如何在复杂的构建脚本中检测“您是否忘记了信号异步完成?”错误

5
作为迁移到Gulp 4的人可能已经知道,gulp.series不会继续执行系列中的任务,如果一个任务没有正确地发出完成信号。
我的问题在于它处理这种错误的方式 - 它只是在控制台中显示一条消息(Did you forget to signal async completion?); gulp仍然以0的错误代码退出。这意味着,如果您在更复杂的构建脚本中运行gulp,对于该脚本来说,它看起来像一切都很好,gulp任务成功完成,但实际上并非如此。(相比之下,如果您使用gulpUtil.plugin error抛出错误,则会导致非0的错误代码。)
因此,我的问题是:你如何从“外部”检测到这种错误?
  • 是否有一种方法使gulp在这种情况下退出非0? (是否有我可以订阅并抛出错误的事件或设置的配置等)
  • 我应该尝试检查应该生成的资源是否存在吗? (我认为这种解决方案非常脆弱。)
  • 我应该“监视”控制台消息并寻找特定字符串,例如“Did you forget to signal…”吗? (呃!)
  • (是的,我知道我可以用gulp做所有事情,然后我就不需要检查错误代码了,但让我们假设在现实中我不能这样做。)
还有其他可能性我没有想到的吗?
1个回答

2
您可以使用流/承诺/回调来发出进程信号。一旦握手完成,您就可以继续进行进程。
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();
    })();    
}

3
感谢您提供详细的回答!不过,这并没有真正回答我的问题 :) 我知道在 gulp 4 中异步完成是如何工作的以及任务应该如何运行。我需要的是一种方式,在 gulp 外部检测进程是否因任务运行不当而停止。如果任务抛出错误,gulp 将以非0错误代码退出 - 这很容易处理!然而,异步完成错误会使 gulp 退出,并返回0 - 使其难以检测和处理。显然,最好还是尽可能避免这种错误 - 使用您提到的方法 - 但事情仍有可能出错,我想处理它。 - Dániel Kis-Nagy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接