我无法让gulp run-sequence
执行我给它的两个函数(它只会执行其中一个。我有类似的东西:
gulp.task('wire', function(){
gulp.src('./index.html')
.pipe(wiredep())
.pipe(gulp.dest('.'));
});
var filesToInject = ['./app/**/*.js', './app/**/*.css'];
gulp.task('inject', function (){
var target = gulp.src('./index.html');
var sources = gulp.src(filesToInject, {read: false});
return target.pipe(inject(sources))
.pipe(gulp.dest('.'));
});
gulp.task('wire-inject', function(callback){
sequence('wire', 'inject', callback);
});
那只会运行inject
任务。只有当我在return
任务中gulp.src
之前添加wire
时才会执行。我还在函数参数中添加了回调,并将其传递到每个the documentation的两个任务中的最后一个管道。
gulp.task('wire', function(callback){
gulp.src('./index.html')
.pipe(wiredep())
.pipe(gulp.dest('.'), callback);
});
var filesToInject = ['./app/**/*.js', './app/**/*.css'];
gulp.task('inject', function (callback){
var target = gulp.src('./index.html');
var sources = gulp.src(filesToInject, {read: false});
return target.pipe(inject(sources))
.pipe(gulp.dest('.'), callback);
});
这并没有引发任何错误,但是如果我把它拿出来它就不会改变任何东西。这个返回语句做了什么,神奇地使我的序列完全运行。文档中的这些回调是什么,我只是通过括号引用来执行它们?即使他们似乎什么都不做,我还需要他们吗?
答案 0 :(得分:3)
Gulp需要知道异步任务何时完成。你有3种方法可以做到这一点:
返回一个事件流,这是您在任务函数中return gulp.src(...).pipe(...);
时所执行的操作。
回复承诺。
让定义任务的函数采用参数。 Gulp将使用您应该在任务结束时调用的回调来调用您的函数。
如果你不这样做,那么Gulp将不会知道该任务是异步的。因此,只要函数返回,它就会考虑完成任务。这有各种各样的后果。 Gulp可以在任务完成之前退出。或者它可以在任务A完成之前启动依赖于任务A的任务B.在某些情况下,您可能不会立即看到 的问题,但随着您的gulpfile变得越来越复杂,您将有更多机会获得不良行为。 run-sequence
并不特别:它需要知道任务何时完成才能正确完成工作。
请注意,您在问题中显示的此代码中的callback
无效:
return target.pipe(inject(sources))
.pipe(gulp.dest('.'), callback);
callback
将不会被调用。将其替换为function () { console.log("Hello!"); callback(); }
。您不会在控制台上看到Hello!
,因为未调用回调。但是,代码确实可以正常工作,因为您返回了流。 Gulp使用您返回的流来确定任务结束,而不是回调(永远不会被调用)。