run-sequence无法按顺序运行gulp任务

4

我在Gulp文件中有3个任务,必须按照以下顺序运行:

  1. clean(删除/dist文件夹中的所有内容)
  2. copy(将多个文件复制到/dist文件夹中)
  3. replace(替换/dist文件夹中某些文件中的一些字符串)

我已经阅读了所有其他帖子,尝试过“run-sequence”,但是由于“replace”任务未最后运行,因此它无效。 我对“callback”的使用感到困惑。 分别运行任务可以正常工作。

var gulp = require('gulp');
var runSequence = require('run-sequence');

gulp.task('runEverything', function(callback) {
    runSequence('clean',
                'copy',
                'replace',
                callback);
});

gulp.task('clean', function () {
    return del(
        'dist/**/*'
    );
});

gulp.task('copy', function() {
    gulp.src('node_modules/bootstrap/dist/**/*')
        .pipe(gulp.dest('dist/vendor'))
    //...
    return gulp.src(['index.html', '404.html', '.htaccess'])
        .pipe(gulp.dest('dist/'));
});

gulp.task('replace', function(){
    gulp.src(['dist/index.php', 'dist/info.php'])
        .pipe(replace('fakedomain.com', 'realdomain.com'))
        .pipe(gulp.dest('dist'));

    return gulp.src(['dist/config.php'])
        .pipe(replace('foo', 'bar'))
        .pipe(gulp.dest('dist'));
});

希望您能提供一个使用这3个任务的完整示例。谢谢。

1个回答

13

关于具有异步操作任务,run-sequence 文档 给出如下建议:

确保它们返回流或承诺,或处理回调

你的copyreplace任务都有多个流。你必须返回所有的流,而不仅是最后一个。如果你不返回其他流,Gulp 将不知道这些流的任何信息,因此也不会等待它们完成。

由于你只能返回一个单一的流,所以你必须合并这些流 [在这里插入《捉鬼敢死队》的参考]。这将给你一个合并后的流,你可以从你的任务中返回它。

以下是使用merge-stream实现它的方法:

var merge = require('merge-stream');

gulp.task('copy', function() {
    var stream1 = gulp.src('node_modules/bootstrap/dist/**/*')
        .pipe(gulp.dest('dist/vendor'))
    //...
    var stream2 = gulp.src(['index.html', '404.html', '.htaccess'])
        .pipe(gulp.dest('dist/'));

    return merge(stream1, stream2);
});

gulp.task('replace', function(){
    var stream1 = gulp.src(['dist/index.php', 'dist/info.php'])
        .pipe(replace('fakedomain.com', 'realdomain.com'))
        .pipe(gulp.dest('dist'));

    var stream2 = gulp.src(['dist/config.php'])
        .pipe(replace('foo', 'bar'))
        .pipe(gulp.dest('dist'));

    return merge(stream1, stream2);
});

感谢您抽出时间帮忙,Sven。除了使用“run-sequence”,还使用“merge-stream”似乎非常有效。 - Alan P.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接