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

Dán*_*agy 5 terminal error-code gulp gulp-4

正如已经迁移到Gulp 4的人可能知道的gulp.series那样 - 如果系列中的任务没有正确地表示完成,则不会继续执行.

我的问题是它处理这种错误的方式 - 它只是控制台中的一条消息(你忘了发信号异步完成吗?) ; gulp仍然以错误代码0退出.这意味着如果你在一个更复杂的构建脚本中运行gulp,那么看起来好像一切都没问题,并且当他们显然没有成功完成gulp任务时.(相反,如果抛出错误gulpUtil.plugin error,则会导致非0错误代码.)

所以我的问题是:你如何从外部发现这样的错误?

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

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

red*_*cky 2

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

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();
});
Run Code Online (Sandbox Code Playgroud)

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

function syncTasks(callback1)
{
    return gulp.series(firstTask, secondTask, (callback2) =>
    {
        callback1();
        callback2();
    })();    
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的详细解答!然而,这并不能真正回答我的问题:)我知道异步完成在 gulp 4 中是如何工作的以及任务*应该*如何表现。我需要的是一种在 gulp 之外检测进程是否由于行为不当的任务而停止的方法。如果任务抛出错误,gulp 会以非 0 错误代码退出——这很容易处理!然而,异步完成错误使 gulp 以 0 退出 - 使其难以检测和处理。显然,这个错误最好尽可能_避免_——使用你提到的方法——但事情仍然可能出错,我想处理它。 (3认同)