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'
如何让它们按顺序运行?
【问题讨论】:
你没有。如果您需要串行任务,请使用grunt
。 gulp
的重点是并行任务(和流)。
@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 任务未按顺序运行的主要内容,如果未能解决你的问题,请参考以下文章