gulp watch并不总是在任务期间观看

时间:2016-06-21 08:34:02

标签: javascript gulp gulp-watch

Gulp工作得非常好。它正确地监视和运行任务,除非它在运行任务的过程中,它不会总是在观察与该同一任务相关的文件,以便在最后一个任务时再次运行任务。结束。

[08:30:51] Starting 'composer'...
composer task
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.
Nothing to install or update
Generating autoload files
Process exited with code 0
[08:30:53] Finished 'composer' after 1.62 s
编辑:不要介意短时间;这只是一个糟糕的例子。我真正运行的任务在10-15秒内运行,在这段时间我可以进行额外的相关更改并保存。

编辑composer.lock文件时会触发此操作。

在编辑了composer.lock文件并且任务已经开始运行之后,在编辑和保存composer.lock期间再次编辑和保存composer.lock" composer task"是输出,

预期:完成后再次运行的任务

实际:任务完成并且不会重新运行以适应自

以来发生的更改

我在Ubuntu上使用gulp watch。

1 个答案:

答案 0 :(得分:2)

运行任务时,gulp.watch()并不是在观察。虽然gaze中有debounceDelay option可以阻止相同的事件在某个时间窗口内触发,但它很短,以至于您不太可能遇到它。您可以尝试将其设置为0以确定,但这可能会导致更多问题而不是解决。

更可能的原因是orchestrator根本没有运行任务if it is already running

  

Orchestrator将确保每个任务和每个依赖项在业务流程运行期间运行一次,即使您指定它运行多次也是如此。 [...]如果您需要多次运行任务,请等待业务流程结束(开始回调),然后再次调用start。

我实际上可以通过使用setTimeout()模拟长时间运行的任务来重现您的问题:

gulp.task('task', function (done) {
  setTimeout(done, 10000);
});

gulp.task('watch', function() {
  gulp.watch('some_file.txt', {debounceDelay:0}, ['task']);
});

我能解决此问题的唯一方法是手动跟踪任务是否已经运行,然后在执行任务完成后安排重新运行:

function runTask(taskName) {
  var running = false;
  var rerun = false;
  return function() {
    if (running) {
      rerun = true;
    }
    running = true;
    gulp.start(taskName, function() {
      if (rerun) {
        rerun = false;
        gulp.start(taskName);
      } else {
        running = false;
      }
    }); 
  };
}

gulp.task('task', function (done) {
  setTimeout(done, 10000);
});

gulp.task('watch', function() {
  gulp.watch('some_file.txt', {debounceDelay:0}, runTask('task'));
});