问题
您遇到此问题的原因是您正在使用 Gulp 的一部分,而 Gulp 的最终用户实际上并未使用该部分。这是一个小 gulpfile,它重现了您报告的行为:
var gulp = require("gulp");
gulp.task('foo');
gulp.task('default', function () {
gulp.start('foo', function () {
console.log("callback!");
});
setTimeout(function () {
gulp.start('foo');
}, 1000);
});
运行这将在控制台上产生:
[12:23:48] Using gulpfile /tmp/t15/test.js
[12:23:48] Starting 'default'...
[12:23:48] Starting 'foo'...
[12:23:48] Finished 'foo' after 66 μs
[12:23:48] Finished 'default' after 1.24 ms
callback!
[12:23:49] Starting 'foo'...
[12:23:49] Finished 'foo' after 8.99 μs
callback!
您会看到callback! 出现了两次,尽管gulp.start 仅通过回调调用了一次!问题是 Gulp 会记住回调,甚至在第二次调用 gulp.start 时也会使用它。
如果你想了解血淋淋的细节,请查看orchestrator,这是 Gulp 使用的。查找doneCallback 及其管理方式。基本行为是,如果start 是通过回调调用的,那么它会删除doneCallback 的任何先前值,但如果它没有通过回调调用,那么旧值保持不变,并且实际上会被后续调用重用start.
安全的解决方案
无论如何。看来您想按顺序运行一堆任务。我过去这样做的方式是声明将按顺序运行其他任务的任务,以便:
它的依赖是依次运行的任务的所有依赖的并集。
它的实现函数调用它应该依次运行的所有任务的实现函数。
这是一个简单的例子:
var gulp = require("gulp");
gulp.task('x');
gulp.task('y');
gulp.task('q');
// We are defining task `a`, with dependencies `x` and `y`.
var a_deps = ['x', 'y'];
function a() {
console.log("a");
}
gulp.task('a', a_deps);
// We are defining task `b`, with dependencies `x` and `q`.
var b_deps = ['x', 'q'];
function b() {
console.log("b");
}
gulp.task('b', b_deps);
// We are defining task `default`, which is equivalent to running tasks
// `a` and `b` in sequence.
gulp.task('default', a_deps.concat(b_deps), function () {
a();
b();
});
为了记录,我不使用run-sequence,因为当我尝试它时,我看到它多次运行我的依赖项,这对我来说是不可接受的。
当 Gulp 4 出现时,我们将能够使用 gulp.series 来排序任务