我正在进入许多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." }))
});
在控制台中,通知现在可以正确计时,但是在执行结束时,就在完成' mainTask'之前。在xx ms之后,最终的所有任务完成了#39;消息触发[n-1]次,其中n是子任务的计数。
导致此最终通知多次触发的原因是什么?如何抑制?
答案 0 :(得分:9)
我猜你试图在每项任务结束时附加一个gulp-notify的调用,然后在依赖于之前任务的一般任务结束时调用一次。
所以这个问题可能与正确沟通他们的“完成状态”的任务有关。到主要任务。对于此主题,您可以查看Running tasks in series, i.e. Task Dependency配方或总是方便的run-sequence包。
<强>更新强>
为了让任务知道它的子任务已经完成,就是让它们返回一个流,所以在示例代码中,子任务可以简单地返回gulp.src
管道。
gulp-notify 将为传递的流中存在的每个文件输出该消息,因此,在示例的最后一个任务中,它将被调用两次。对gp_notify的调用应更改为:gp_notify({message:&#34;所有任务完成。&#34; ,onLast:true })。这样,只会通知最后一个文件的消息。
答案 1 :(得分:8)
默认情况下,gulp-notify
会为流中的每个文件发送通知。如果您只需要每个流一个通知,请将onLast: true
添加到传递给notify()
的选项中。 e.g。
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 }));
});