如何强制gulp调用同步运行?

时间:2014-12-13 14:32:40

标签: javascript node.js gulp

我希望下面的gulp调用一个接一个地同步运行。但他们不遵守命令。

run-sequence节点模块在这里没有帮助,因为我没有尝试串行运行gulp任务(即它的语法类似于gulp.task("mytask", ["foo", "bar", "baz"]等),而是gulp“调用“串联,如下所示。

gulp.task("dostuff", function (callback) {

  gulp
    .src("...")
    .pipe(gulp.dest("...");

  gulp
    .src("...")
    .pipe(gulp.dest("...");

  gulp
    .src("...")
    .pipe(gulp.dest("...");

  callback();
});

如何让它们一个接一个地运行?

5 个答案:

答案 0 :(得分:8)

您可以使用 async 作为调用的控制流,仅将其置于一项任务中,同时避免您获得“金字塔效果”。所以这样的事情应该对你的用例有好处:

var async = require('async');

gulp.task('yeah', function (cb) {
  async.series([
    function (next) {
      gulp.src('...')
        .pipe(gulp.dest('...')
        .on('end', next);
    },
    function (next) {
      gulp.src('...')
        .pipe(gulp.dest('...')
        .on('end', next);
    },
    function (next) {
      gulp.src('...')
        .pipe(gulp.dest('...')
        .on('end', next);
    }
  ], cb);
});

这也将允许您进行一些错误处理,并在发生问题时更好地定位目标。

答案 1 :(得分:3)

嗯,这只是流,所以你可以听终结事件(注意厄运的金字塔!)

gulp.task("dostuff", function (callback) {

  gulp
    .src("...")
    .pipe(gulp.dest("..."))
    .on('end', function () {

      gulp
        .src("...")
        .pipe(gulp.dest("..."))
        .on('end', function () {

          gulp
            .src("...")
            .pipe(gulp.dest("..."))
            .on('end', callback);

        });
    });
});

但它可能是一个更好的模式,可以将它分解为多个任务,每个任务都依赖于前一个任务。

答案 2 :(得分:2)

run-sequence:

  

按指定顺序运行一系列gulp任务。这个功能   旨在解决您已定义运行顺序的情况,   但是选择不使用或不能使用依赖项。

npm install --save-dev run-sequence

// runSequence will ensure this task will run the following tasks in the listed order
gulp.task('things-to-do', callback => runSequence(
    'clean-up-workspace', // clean up before copying new files
    'copy-new-files', // wait till copy-new-files done before linting
    'lint', // wait till lint is done before running minify
    'minify', // wait till minify is done before starting laundry and dinner
    ['do-laundry', // do laundry and cook dinner at the same time
    'cook-dinner'],
    'bath-cat', // don't bath the cat till both laundry and dinner are done
    callback
));

https://www.npmjs.com/package/run-sequence

答案 3 :(得分:0)

使用synchronous mode for glob

然后返回gulp.src的结果:

gulp.task('render', function() {
    var appJsFiles = _.map(glob.sync('src/**/*.js'), function(f) {
        return f.slice(6);
    });
    // Render the file.
    return gulp.src('src/template.html')
        .pipe(template({
            scripts: appJsFiles,
            styles: ['style1.css', 'style2.css', 'style3.css']
        }))
        .pipe(gulp.dest(config.build_dir));
});

答案 4 :(得分:0)

你可以在最后一个管道之后添加这样的东西

.pipe(gulp.dest(FINAL_DEST))
.on('end', () => gulp.src(['build']) .pipe(clean()))