Azure Pipeline执行Gulp任务遇“did you forget to signal async completion?”错误求助
Gulp任务在Azure Pipeline中报错“did you forget to signal async completion?”
我知晓这可能是重复问题,但已花费近一天时间仍未解决。我的gulpfile.js代码如下:
const gulp = require('gulp'); const javascriptObfuscator = require('gulp-javascript-obfuscator'); gulp.task("javascriptObfuscator", (done) => { gulp.src('./js/**/*.js', {base: './'}) .pipe(javascriptObfuscator()) .pipe(gulp.dest('./')) done(); });在Azure Pipeline的Gulp任务中执行该文件时,遇到错误提示“did you forget to signal async completion?”,恳请技术支持。
这个问题我之前也碰到过,核心原因是Gulp 4.x对异步任务的完成信号要求比旧版本严格太多。你现在的代码里,done()是在文件流刚开始执行就立刻调用了,完全没等文件混淆、输出这些异步操作完成,Gulp就误以为任务已经结束,所以抛出了这个错误。
给你两个可行的修复方案:
方案1:返回流(推荐)
Gulp的流本身就是异步对象,只要把gulp.src()启动的流返回出去,Gulp就能自动跟踪它的完成状态,根本不需要手动调用done():
const gulp = require('gulp'); const javascriptObfuscator = require('gulp-javascript-obfuscator'); gulp.task("javascriptObfuscator", () => { // 直接返回流,让Gulp自动监听完成状态 return gulp.src('./js/**/*.js', {base: './'}) .pipe(javascriptObfuscator()) .pipe(gulp.dest('./')); });
方案2:在流完成后调用done()
如果你一定要用done()回调的写法,就得把它绑定到流的end事件上,确保所有异步操作都完成后再通知Gulp:
const gulp = require('gulp'); const javascriptObfuscator = require('gulp-javascript-obfuscator'); gulp.task("javascriptObfuscator", (done) => { gulp.src('./js/**/*.js', {base: './'}) .pipe(javascriptObfuscator()) .pipe(gulp.dest('./')) // 监听流结束事件,完成后再调用done .on('end', done); });
这两个方案都能解决你在Azure Pipeline里遇到的错误,个人推荐方案1,代码更简洁也符合Gulp的最佳实践。
内容的提问来源于stack exchange,提问作者Dharmendra Singh Negi
相关产品推荐
相关产品推荐

