Gulp 任务未按顺序运行

Posted

技术标签:

【中文标题】Gulp 任务未按顺序运行【英文标题】:Gulp tasks not running in series 【发布时间】:2015-02-15 04:09:39 【问题描述】:

我正在关注官方文档,但我的 gulp 任务没有按顺序运行。

gulp.task("mytask", ["foo", "bar", "baz"]);

gulp.task("foo", function (callback) 
  gulp
    .src("...")
    .pipe(changed("..."))
    .pipe(gulp.dest(function (file) 
      // ...stuff
      return "...";
    ))
    .on("end", function() 
      // ...stuff
      callback();
    );
);

gulp.task("bar", function (callback) 
  //...
);

gulp.task("baz", function (callback) 
  //...
);

但我的输出是这样的:

Starting 'mytask'...
Starting 'foo'...
Starting 'bar'...                   // <-- foo is not done yet!
Finished 'foo'
Finished 'bar'
Starting 'baz'...
Finished 'baz'
Finished 'mytask'

如何让它们按顺序运行?

【问题讨论】:

你没有。如果您需要串行任务,请使用gruntgulp 的重点是并行任务(和流)。 @Mathletics 你大错特错。 Gulp 允许同步和异步。有两种方法可以同时实现。 Gulp. can't figure how to run tasks synchronously after each other 的可能重复项 那个“重复”的答案并非如此。我的问题假设父任务的语法处理排序。显然不是。您需要明确重申所有相关任务的顺序,如下面接受的答案所示。现在在父级上声明就足够了。 【参考方案1】:

应更新此答案以反映 Gulp 4 以系列方式运行任务的方式。

如果您希望 Gulp 任务以一系列方式运行,您应该使用 gulp.series 来运行它们,如果您希望它们并行运行 gulp.parallel。

在使用 Gulp 系列时,您将执行以下操作:

gulp.task("mytask", gulp.series(foo, bar, baz));

那些其他任务可能不再是任务,而是常量,比如

  const foo = () => 
     return gulp.src("...")
     .pipe(changed("..."))
     .pipe(gulp.dest(function (file) 
      // ...stuff
      return "...";
    ));
  

因此该系列列出了常量而不是某些字符串的原因。在迁移到 Gulp 4 时可能会出现其他问题,但是像这样的简单 gulp 文件的修复很容易制作。

gulp 4 https://codeburst.io/switching-to-gulp-4-0-271ae63530c0的简单教程

【讨论】:

【参考方案2】:

如果您希望它们串联运行,您当前必须使用任务依赖系统,例如:

gulp.task("mytask", ["foo", "bar", "baz"]);

gulp.task("foo", function (callback) 
  //...
  callback(...);
);

gulp.task("bar", ['foo'], function (callback) 
  //...
  callback(...);
);

gulp.task("baz", ['bar'], function (callback) 
  //...
  callback(...);
);

它很笨重。我认为这将在未来的版本中得到解决。

根据情况您可以return a promise or event stream 而不是传入并调用回调。

我想我应该提到run-sequence 模块是目前的一个选项。但是上面说明的任务依赖系统是目前gulp自己提供的机制。请参阅this comment re:run-sequence 和 gulp 中任务排序的未来。

【讨论】:

哇,好用……你说得对,它很笨重。你有参考文献吗? 而且事件流选项似乎对我也不起作用,但你的方式可以。 是否可以使用事件流选项取决于您在任务中执行的操作。在您的foo 任务中,您实际上在// ...stuff 上发生了什么事吗?文档非常混乱,但请参阅我最后一段中的链接并向下滚动到“所以这个例子看起来像这样:”。您可能还想看看Support running task synchronously #96。 @Mathletics 最大化并发性很棒......这并不意味着您永远不需要连续发生事情。我相信 gulp 项目已经决定在未来的版本中促进这一点。见here 和changes coming in gulp 4。 @hbob 类比错误。你在谈论过程;我说的是工具。在你的比喻中,你想用一锅开水做一个煎鸡蛋,但那是煮熟的工具。 (我也觉得,如果你是 gulp 中同步操作的专家,你会问一个比“我如何在 gulp 中进行同步操作”更有趣的问题。)有一个用于同步操作的工具;它被称为 Grunt,非常适合该用例。

以上是关于Gulp 任务未按顺序运行的主要内容,如果未能解决你的问题,请参考以下文章

Gulp任务 - 按顺序运行,没有依赖关系

关于gulp中顺序执行任务

Gulp插件之run-sequence控制任务顺序或者并行执行

C - 语句未按顺序执行

Node Js Async 未按正确顺序运行并跳过承诺

AWS Device Farm上的Appium测试未按指定顺序执行