在gulp.series中使用del()

vad*_*shb 6 javascript gulp

我尝试在gulp 4中启动任务之前清理文件夹

var gulp = require('gulp');
var del = require('del');

gulp.task('clean', function() {
    del.sync('folder/*');
});

gulp.task('foo', gulp.series('clean', 'something'));
Run Code Online (Sandbox Code Playgroud)

它不起作用,因为'clean'任务必须返回一些流.我找到了解决方法:

gulp.task('clean', function() {
    del.sync('folder/*');
    var emptyStream = gulp.src([]).pipe(gulp.dest('/'));
    return emptyStream;
});
Run Code Online (Sandbox Code Playgroud)

,但仍希望找到更好的解决方案.

Suk*_*ima 7

gulp允许三种管理异步性的选项.首先,如果函数完成(不返回任何/未定义或简单值),gulp会认为任务已完成并继续.但是,如果您的任务是异步任务(尽管在节点中),那么您......

  1. 返回一个流.return gulp.src(...).pipe(gulp.dest(...));请注意,返回值是一个流,因为gulp.src和.pipe返回流.
  2. 回报承诺.
  3. 使用回调.如果你在函数的参数中放置一个变量,那么gulp会期望调用回调并等待它发生.将回调值作为参数赋予被认为是失败并且在没有值的情况下调用它被认为是成功的.

在del的情况下,它不执行前两个但是接受一个回调,它处理与上面的场景3中相同的回调.

gulp.task('clean', function(done) {
  del(['output'], done);
});
Run Code Online (Sandbox Code Playgroud)

例子

以下是使用通过流手动调用的回调的示例:

gulp.task('foo', function(done) {
  gulp.src('input')
    .pipe(gulp.dest('output'))
    .on('end', function() {
      done();
    })
    .on('error', function(err) {
      done(err);
    });
});
Run Code Online (Sandbox Code Playgroud)

由于流是如此常见,返回一个将为您做上述.(注意,done删除了所以gulp不会指望它被调用).

gulp.task('foo', function() {
  return gulp.src('input')
    .pipe(gulp.dest('output'));
});
Run Code Online (Sandbox Code Playgroud)

并非所有内容都可以成为流,并且回调可能令人畏惧,因此您可以返回承诺:

gulp.task('foo', function() {
  return new Promise(function(resolve) {
    setTimeout(resolve, 5000);
  });
});
Run Code Online (Sandbox Code Playgroud)


har*_*shr 5

您还可以将回调传递给clean任务以获取返回的流

var del = require('del');

gulp.task('clean', function(cb) {
    del(['output'], cb);
});
Run Code Online (Sandbox Code Playgroud)

看看这里