Gulp 吞咽错误:以下任务未完成:是否忘记发出异步完成信号?

Gulp 吞咽错误:以下任务未完成:是否忘记发出异步完成信号?,gulp,Gulp,我有以下gulpfile.js,通过命令行gulp消息执行: 我收到以下错误消息: [14:14:41] Using gulpfile ~\Documents\node\first\gulpfile.js [14:14:41] Starting 'message'... HTTP Server Started [14:14:41] The following tasks did not complete: message [14:14:41] Did you forget to signal a

我有以下gulpfile.js,通过命令行gulp消息执行:

我收到以下错误消息:

[14:14:41] Using gulpfile ~\Documents\node\first\gulpfile.js
[14:14:41] Starting 'message'...
HTTP Server Started
[14:14:41] The following tasks did not complete: message
[14:14:41] Did you forget to signal async completion?
我在Windows10系统上使用Gulp4。这是从
gulp--version
得到的输出:

[14:15:15] CLI version 0.4.0
[14:15:15] Local version 4.0.0-alpha.2

因为您的任务可能包含异步代码,所以当您的任务完成执行时,您必须发出gulp信号(““异步完成”)

在Gulp3.x中,您可以不这样做就离开。如果您没有显式地发出异步完成信号,gulp只会假设您的任务是同步的,并且在任务函数返回时它就完成了。Gulp4.x在这方面更为严格。您必须明确地发出任务完成的信号

您可以通过以下方式实现:

1.归还 如果您只是尝试打印某些内容,那么这实际上不是一个选项,但它可能是最常用的异步完成机制,因为您通常使用的是gulp streams。下面是一个(相当做作的)示例,为您的用例演示它:

var print = require('gulp-print');

gulp.task('message', function() {
  return gulp.src('package.json')
    .pipe(print(function() { return 'HTTP Server Started'; }));
});
这里的重要部分是
return
语句。如果不返回流,gulp无法确定流何时完成

2.归还 这是一种更适合您的用例的机制。请注意,大多数情况下,您不必自己创建
Promise
对象,它通常由包提供(例如,经常使用的包返回
Promise

使用语法可以进一步简化。所有标记为
async
的函数都隐式返回一个承诺,因此以下功能也有效(如果您的:

3.调用回调函数 对于您的用例来说,这可能是最简单的方法:gulp自动将回调函数作为其第一个参数传递给您的任务。完成后只需调用该函数:

gulp.task('message', function(done) {
  console.log("HTTP Server Started");
  done();
});
4.归还 如果您必须直接调用命令行工具,因为没有可用的node.js包装器,这将非常有用。它适用于您的用例,但显然我不推荐它(特别是因为它不是很便携):

5.返回一个。 我从未使用过这种机制,但如果您使用的是RxJS,它可能会很有用。如果你只是想打印一些东西,那就有点过分了:

var of = require('rxjs').of;

gulp.task('message', function() {
  var o = of('HTTP Server Started');
  o.subscribe(function(msg) { console.log(msg); });
  return o;
});
6.归还 与前一个一样,出于完整性的考虑,我将包含此内容,但除非您出于某种原因已经在使用
EventEmitter
,否则它不是您真正要使用的东西

gulp.task('message3', function() {
  var e = new EventEmitter();
  e.on('msg', function(msg) { console.log(msg); });
  setTimeout(() => { e.emit('msg', 'HTTP Server Started'); e.emit('finish'); });
  return e;
});

解决方法:我们需要调用回调函数(Task和Anonymous):


吞咽4的问题

要解决此问题,请尝试更改当前代码:

gulp.task('simpleTaskName', function() {
  // code...
});
例如:

gulp.task('simpleTaskName', async function() {
  // code...
});
gulp.task('simpleTaskName', done => {
  // code...
  done();
});
或者说:

gulp.task('simpleTaskName', async function() {
  // code...
});
gulp.task('simpleTaskName', done => {
  // code...
  done();
});
这成功了

gulp.task('script', done => {
    // ... code gulp.src( ... )
    done();
});

gulp.task('css', done => {
    // ... code gulp.src( ... )
    done();
});

gulp.task('default', gulp.parallel(
        'script',
        'css'
  )
);

上一次更新于2021年2月18日,我在使用上述解决方案后发现问题,然后我已通过使用以下解决方案来解决问题,而不是使用以下版本

文件:Package.json

...,
"devDependencies": {
        "del": "^6.0.0",
        "gulp": "^4.0.2",
      },
...
文件:gulpfile.js示例

const {task} = require('gulp');
const del = require('del');

async function clean() {
    console.log('processing ... clean');

    return del([__dirname + '/dist']);
}

task(clean)
...

我在尝试运行一个非常简单的SASS/CSS构建时遇到了同样的错误

我的解决方案(可能会解决相同或类似的错误)只是在默认任务函数中添加
done
作为参数,并在默认任务结束时调用它:

// Sass configuration
var gulp = require('gulp');
var sass = require('gulp-sass');

gulp.task('sass', function () {
    gulp.src('*.scss')
        .pipe(sass())
        .pipe(gulp.dest(function (f) {
            return f.base;
        }))
});

gulp.task('clean', function() {
})

gulp.task('watch', function() {
    gulp.watch('*.scss', ['sass']);
})


gulp.task('default', function(done) { // <--- Insert `done` as a parameter here...
    gulp.series('clean','sass', 'watch')
    done(); // <--- ...and call it here.
})
//Sass配置
var gulp=需要(“gulp”);
var sass=需要('gulp-sass');
吞咽任务('sass',函数(){
gulp.src(“*.scss”)
.pipe(sass())
.管道(大口目的地)(功能(f){
返回f.base;
}))
});
吞咽任务('clean',函数(){
})
吞咽任务('watch',function(){
大口喝手表('*.scss',['sass']);
})

galp.task('default',function(done){/我不能说自己对此非常了解,但我遇到了同样的问题,并已解决了它

解决这个问题的第七种方法是使用异步函数

编写函数,但添加前缀async

通过这样做,galp将函数包装成一个承诺,任务将无错误地运行

示例:

async function() {
  // do something
};
资源:

async function() {
  // do something
};
  • Gulp页面异步完成的最后一部分:

  • Mozilla


  • 在默认函数中添加done作为参数。这样就可以了。

    对于那些试图使用gulp进行招摇过市的本地部署的人,以下代码将有所帮助

    var gulp = require("gulp");
    var yaml = require("js-yaml");
    var path = require("path");
    var fs = require("fs");
    
    //Converts yaml to json
    gulp.task("swagger", done => {
        var doc = yaml.safeLoad(fs.readFileSync(path.join(__dirname,"api/swagger/swagger.yaml")));
        fs.writeFileSync(
            path.join(__dirname,"../yourjsonfile.json"),
            JSON.stringify(doc, null, " ")
            );
        done();
    });
    
    //Watches for changes    
    gulp.task('watch', function() {
      gulp.watch('api/swagger/swagger.yaml', gulp.series('swagger'));  
    });
    

    给你:

    无同步任务

    同步任务不再受支持。它们通常会导致难以调试的细微错误,例如忘记从任务返回流

    当您看到
    是否忘记发出异步完成信号?
    警告时,未使用上述任何技术。您需要使用错误优先回调或返回流、承诺、事件发射器、子进程或可观察对象来解决问题

    使用
    异步
    /
    等待

    在不使用上述任何选项时,您可以将任务定义为
    异步函数
    ,该函数将任务包装在承诺中。这允许您使用
    等待
    和其他同步代码同步处理承诺

    const fs = require('fs');
    
    async function asyncAwaitTask() {
      const { version } = fs.readFileSync('package.json');
      console.log(version);
      await Promise.resolve('some result');
    }
    
    exports.default = asyncAwaitTask;
    

    你需要做两件事:

  • 在函数之前添加
    async
  • return
    启动函数

    var gulp = require('gulp');
    
    gulp.task('message', async function() {
        return console.log("HTTP Server Started");
    });
    

  • 基本上,v3.X更简单,但v4.X在这些同步和异步任务方面是严格的

    async/await
    是理解工作流和问题的非常简单和有用的方法

    使用这个简单的方法

    const gulp = require('gulp')
    
    gulp.task('message',async function(){
    return console.log('Gulp is running...')
    })
    

    我最近一直在努力解决这个问题,并找到了创建运行
    sass
    default
    任务的正确方法,然后
    sass:watch
    是:

    gulp.task('default', gulp.series('sass', 'sass:watch'));
    

    当从gulp版本3迁移到版本4时,这是一个问题,只需向回调函数添加一个参数即可,请参见示例

       const gulp = require("gulp")
    
        gulp.task("message", function(done) {
          console.log("Gulp is running...")
          done()
        });
    
    我的so
    gulp.task('default', gulp.series('sass', 'sass:watch'));
    
       const gulp = require("gulp")
    
        gulp.task("message", function(done) {
          console.log("Gulp is running...")
          done()
        });
    
    async function min_css() {
        return await gulp
            .src(cssFiles, { base: "." })
            .pipe(concat(cssOutput))
            .pipe(cssmin())
            .pipe(gulp.dest("."));
    }
    
    async function min_js() {
        return await gulp
            .src(jsFiles, { base: "." })
            .pipe(concat(jsOutput))
            .pipe(uglify())
            .pipe(gulp.dest("."));  
    }
    
    const min = async () => await gulp.series(min_css, min_js);
    
    exports.min = min;