【问题标题】:How do I process a notification in gulp after all tasks are complete?所有任务完成后如何在 gulp 中处理通知?
【发布时间】:2014-10-28 15:56:55
【问题描述】:

我正在进入 Gulp 的许多流中,并且遇到了一个令人困惑的主题。我想在所有任务实际完成时发布通知。我看到任务已执行但默认异步运行。

如果我想在每个步骤完成后显示通知...并在所有步骤完成后显示通知怎么办?

在 gulp 中更好地控制任务时间的最佳方法是什么?

目前,我正在使用 gulp-notify 来显示通知。

更新 X 2

我并没有真正遇到任何错误,但想更好地了解此处的操作顺序以及如何触发我自己的所有任务何时完成的通知。这是一个例子。

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." }))
});

在控制台中,通知现在已正确计时,但是在执行结束时,就在 xx ms 后 Finished 'mainTask' 之前,最终的 'All tasks complete' 消息会触发 [n-1] 次,其中 n是子任务的计数。

是什么导致这个最终通知被触发了这么多次,如何抑制?

【问题讨论】:

标签: gulp gulp-notify


【解决方案1】:

我猜你试图在每个任务结束时附加一个对 gulp-notify 的调用,并在依赖于之前任务的一般任务结束时附加一个调用。

所以问题可能与任务没有正确地将其“完成状态”传达给主要任务有关。对于这个主题,您可以查看Running tasks in series, i.e. Task Dependency 配方或总是很方便的run-sequence 包。

更新

为了让一个任务知道它的子任务已经完成是让它们返回一个流,所以在示例代码中子任务可以简单地返回gulp.src管道。

gulp-notify 当使用字符串消息调用时,将为传递的流中存在的每个文件输出该消息,因此,在示例的最后一个任务中,它将被调用两次。对 gp_notify 的调用应更改为:gp_notify({ message: "All tasks complete.", onLast: true })。这样,消息只会被通知到最后一个文件。

【讨论】:

  • 是的......问题是通知会在任务实际完成之前运行......例如,主任务的通知会在子任务之前触发...... .我确实简要阅读了有关在 gulp 中实现承诺的内容,但不确定这将如何在“管道”中工作。
  • k...一切正常,但已更新以帮助您可视化我要问的内容
  • 您应该在 task1task2 任务中的 gulp.src 调用之前放置 return 以便它们通知调用任务它们已完成。每个 gulp 任务都会通知它们的完整性,返回一个流或调用调用者可能提供的回调。因此,在您的示例中,return 语句应该可以解决问题。
  • 所以我添加了退货,它确实改变了一些事情......每次之后我都收到了通知......但是,“mainTask”中的通知在完成状态后被触发了 [n-1] 次到达。
  • 其实我不知道 gulp-notify 插件应该如何工作。无论如何,仍然谈到上面的示例,gp_notify 将接收由gulp.src 创建的流,其中将包含 2 个文件 ['file1_2.js'、'file3_4.js']。我猜它会打印您的输出消息“所有任务完成。”两次,但我只是在猜测。
【解决方案2】:

默认情况下,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 }));
});

【讨论】:

  • 谢谢!我一直在到处寻找 onLast 的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多