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

var gulp = require('gulp');

gulp.task('message', function() {
  console.log("HTTP Server Started");
});

我得到以下错误消息:

[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?

我在Windows 10系统上使用gulp 4。下面是gulp——version的输出:

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

当前回答

我得到了同样的错误试图运行一个非常简单的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.
})

希望这能有所帮助!

其他回答

我的解决方案:把所有东西都放在async中,然后等待gulp。

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;

基本上v3。X更简单,但是v4。X对同步和异步任务的这些方法是严格的。

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

使用这个简单的方法

const gulp = require('gulp')

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

解决方案很简单,但我概述了我所做的更改、我得到的错误、前后的gulpfile以及包版本——因此使它看起来很长。

除了遵循保存.scss文件时输出的错误外,我还通过遵循前面多个答案的方向解决了这个问题。

简而言之:

我改变了gulp-sass的输入方式——见(A) 我把所有函数都改成了ASYNC函数——参见(B)

(A) gulp-sass import的改动:

之前:var sass = require('gulp-sass) After: var sass = require('gulp-sass')(require('sass'));

简单地将函数转换为ASYNC -

我的gulpfile看起来像以前:

'use strict';
 
// dependencies
var gulp = require('gulp');
var sass = require('gulp-sass');
var minifyCSS = require('gulp-clean-css');
var uglify = require('gulp-uglify');
var rename = require('gulp-rename');
var changed = require('gulp-changed');
 
var SCSS_SRC = './src/Assets/scss/**/*.scss';
var SCSS_DEST = './src/Assets/css';
 
function compile_scss() {
    return gulp.src(SCSS_SRC)
        .pipe(sass().on('error', sass.logError))
        .pipe(minifyCSS())
        .pipe(rename({ suffix: '.min' }))
        .pipe(changed(SCSS_DEST))
        .pipe(gulp.dest(SCSS_DEST));
}
 
 
function watch_scss() {
    gulp.watch(SCSS_SRC, compile_scss);
}

gulp.task('default', watch_scss); //Run tasks
 
exports.compile_scss = compile_scss;
exports.watch_scss = watch_scss;

我的gulpfile看起来像:

'use strict';
 
// dependencies
var gulp = require('gulp');
//var sass = require('gulp-sass');
var sass = require('gulp-sass')(require('sass'));
var minifyCSS = require('gulp-clean-css');
var uglify = require('gulp-uglify');
var rename = require('gulp-rename');
var changed = require('gulp-changed');

var SCSS_SRC = './src/Assets/scss/**/*.scss';
var SCSS_DEST = './src/Assets/css';
 
async function compile_scss() {
    return gulp.src(SCSS_SRC)
        .pipe(sass().on('error', sass.logError))
        .pipe(minifyCSS())
        .pipe(rename({ suffix: '.min' }))
        .pipe(changed(SCSS_DEST))
        .pipe(gulp.dest(SCSS_DEST));
}
 
async function watch_scss() {
    gulp.watch(SCSS_SRC, compile_scss);
}
 
gulp.task('default', watch_scss); // Run tasks
 
exports.compile_scss = compile_scss;
exports.watch_scss = watch_scss;

包版本:

"gulp": "^4.0.2",
"gulp-changed": "^4.0.3",
"gulp-rename": "^2.0.0",
"gulp-uglify": "^3.0.2",
"gulp-clean-css": "^4.3.0",
"gulp-sass": "^5.0.0",
"sass": "^1.38.0"

我得到的错误:

Error in plugin "gulp-sass"
Message:

gulp-sass 5 does not have a default Sass compiler; please set one yourself.
Both the `sass` and `node-sass` packages are permitted.
For example, in your gulpfile:

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

[14:00:37] The following tasks did not complete: default, compile_scss
[14:00:37] Did you forget to signal async completion?

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

由于你的任务可能包含异步代码,你必须在任务执行完成时发出gulp信号(= "async completion")。

在Gulp 3。X,你可以不这样做。如果你没有显式地发出异步完成信号,gulp就会假设你的任务是同步的,只要你的任务函数返回,它就会完成。杯4。X在这方面更为严格。你必须明确地表示任务完成。

你可以通过六种方式做到这一点:

1. 返回一个流

如果你只是想打印一些东西,这不是一个真正的选择,但它可能是最常用的异步完成机制,因为你通常使用gulp流。下面是一个(相当做作的)例子,为你的用例演示它:

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对象,它通常由一个包提供(例如,经常使用的del包返回一个Promise)。

gulp.task('message', function() { 
  return new Promise(function(resolve, reject) {
    console.log("HTTP Server Started");
    resolve();
  });
});

使用async/await语法可以进一步简化。所有标记为async的函数都隐式返回一个Promise,因此以下也可以工作(如果你的node.js版本支持它):

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

3.调用回调函数

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

gulp.task('message', function(done) {
  console.log("HTTP Server Started");
  done();
});

4. 返回子进程

如果你必须直接调用命令行工具,因为没有node.js包装器可用,这是非常有用的。它适用于你的用例,但显然我不推荐它(特别是因为它不是很可移植):

var spawn = require('child_process').spawn;

gulp.task('message', function() {
  return spawn('echo', ['HTTP', 'Server', 'Started'], { stdio: 'inherit' });
});

5. 返回一个RxJS Observable。

我从未使用过这种机制,但如果您正在使用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

与前一个一样,为了完整起见,我包含了它,但它并不是真正要使用的东西,除非您已经出于某种原因使用了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;
});