【问题标题】:gulp watch not always watching during taskgulp watch 在任务期间并不总是在看
【发布时间】:2016-10-22 16:50:42
【问题描述】:

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 task”期间再次编辑和保存 composer.lock,

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

实际:任务完成并且不会重新运行以适应此后发生的更改

我在 Ubuntu 上使用 gulp watch。

【问题讨论】:

  • 我理解您的问题,但您为什么要这样做?我的意思是运行部分的编辑和保存。
  • 为了一个现实的例子,假设我正在运行一个将 TypeScript 编译成 JavaScript 的任务。如果我写了一些东西并保存,那么编译器任务就会运行,然后在它运行时我进行一些快速的相关更改,然后第一个任务完成,但任务不会再次运行:那么编译的 JS 文件的状态将不匹配源文件,因为编译任务没有再次运行。
  • 您在 1.62 秒内快速做出相关更改?我希望有人对此有答案,因为我也对此感兴趣,但我无法想象一个解决方案,因为您通常不会在编译时更改代码。
  • 对不起,这个例子很糟糕。我实际使用的任务是运行 10-15 秒。而且我认为如果编译是在文件更改时自动进行的,那么您在编译时会更改很多代码,因为您可能在编写和保存时没有编译的意图,而 gulp 任务仍在为您编译。
  • 我认为在其他地方这将是一个很好的讨论话题。自动化与自己触发编译的旧方式

标签: javascript gulp gulp-watch


【解决方案1】:

当您运行任务时,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'));
});

【讨论】:

  • 你的回答很酷,但如果我保存 3 个文件,我的构建需要 15 秒。我将不得不等待 45 秒才能得到结果?在理想的世界中,我应该能够取消任务并再次运行它。我一直在查看使用github.com/paulmillr/chokidargithub.com/kingmotley/gulp-debounced-watch,但还没有成功
  • 这不是一个理想的世界。您不能取消任务,也不能在任务已经运行时启动它。 (去抖不是问题。请参阅我的回答。)
  • 这在很多层面上都糟透了。必须有替代方案!无论如何谢谢@Sven
  • @CESCO 解决方案写在这里,你只需要等待 30s,因为这个脚本一次只排队 1 次重新运行
  • @SvenSchoenung 请更正您的代码示例。 if (rerun) { rerun 变量不能保证被初始化。请使用var并在running旁边的开头初始化它
猜你喜欢
  • 2016-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 2015-07-14
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
相关资源
最近更新 更多