我正在进入许多Gulp流,并遇到了一个混乱的主题.我想在所有任务实际完成时发布通知.我看到任务已执行但默认情况下是异步运行的.
如果我想在每个步骤完成后显示通知,并且在所有步骤完成后结束,该怎么办?
在gulp中获得更多控制任务时间的最佳方法是什么?
目前,我正在使用gulp-notify来显示通知.
我真的没有任何错误,但是想更好地了解这里的操作顺序以及如何触发我自己的所有任务完成时的通知.这是一个例子.
var gulp = require('gulp'),
gp_concat = require('gulp-concat'),
gp_notify = require('gulp-notify');
gulp.task('task1', function() {
return gulp.src(['file1.js','file2.js'])
.pipe(gp_concat('file1_2.js')
.pipe(gp_notify({ message: "file1_2 created." }
})
gulp.task('task2', function() {
return gulp.src(['file3.js','file4.js'])
.pipe(gp_concat('file3_4.js')
.pipe(gp_notify({ message: "file3_4 created." }
})
gulp.task('mainTask', ['task1','task2'], function() {
gulp.src('file*_*.js')
.pipe(gp_notify({ message: "All tasks complete." }))
});
Run Code Online (Sandbox Code Playgroud)
在控制台,通知,现在时机正确,但在执行结束时,右侧前完成"MainTask的" XX毫秒后的最终"所有任务完成消息触发关闭[N-1]次,其中n是计数子任务.
导致此最终通知被多次触发的原因是什么,以及如何抑制?
我猜你试图在每个任务结束时附加一个gulp-notify的调用,并且在依赖于前一个任务的一般任务结束时调用一个.
所以问题可能与任务没有正确地将他们的"完成状态"正确地传达给主任务有关.对于本主题,您可以检查系列中的正在运行的任务,即任务依赖关系配方或始终方便的运行顺序包.
更新
为了让任务知道它的子任务完成是让它们返回一个流,所以在示例代码中子任务可以简单地返回gulp.src
管道.
gulp-notify在使用字符串消息调用时将为传递的流中存在的每个文件输出该消息,因此,在示例的最后一个任务中,它将被调用两次.对gp_notify的调用应更改为:gp_notify({message:"所有任务完成." ,onLast:true }).这样,将仅通知最后一个文件的消息.
默认情况下,gulp-notify
为流中的每个文件发送通知.如果您只需要每个流一个通知,请添加onLast: true
到传递给的选项notify()
.例如
var gulp = require('gulp'),
gp_concat = require('gulp-concat'),
gp_notify = require('gulp-notify');
gulp.task('task1', function() {
return gulp.src(['file1.js','file2.js'])
.pipe(gp_concat('file1_2.js'))
.pipe(gp_notify({ message: "file1_2 created.", onLast: true }));
});
gulp.task('task2', function() {
return gulp.src(['file3.js','file4.js'])
.pipe(gp_concat('file3_4.js'))
.pipe(gp_notify({ message: "file3_4 created.", onLast: true }));
});
gulp.task('mainTask', ['task1','task2'], function() {
gulp.src('file*_*.js')
.pipe(gp_notify({ message: "All tasks complete.", onLast: true }));
});
Run Code Online (Sandbox Code Playgroud)