2016-06-21 54 views
2

Gulp的作品几乎很棒。它监视并正确运行任务,除非它处于运行任务的中间,它不会一直在监视与该任务相关的文件,以便在最后一项任务完成时再次运行任务。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-15s内运行,在这段时间内,我可以进行其他相关更改并保存,这是现实的。

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

已经编辑了composer.lock文件和任务后,已经开始运行,编辑和在时间“作曲的任务”是输出再次保存composer.lock,

预计:任务后,再次运行完成

实际:任务完成并不会重新运行,以适应该发生的,因为

我使用Ubuntu上一口关注这些变化。

+0

我明白你的问题,但你为什么要这么做?我的意思是编辑和保存,而运行的一部分。 – KRONWALLED

+0

为了一个现实的例子,说我正在运行一个任务将TypeScript编译成JavaScript。如果我编写了一些东西并保存,然后运行编译器任务,然后在运行时我做了一些快速的相关更改,然后第一个任务完成,但任务不再运行:那么编译的JS文件的状态将不匹配因为编译任务没有再次运行,所以源文件的源代码文件。 –

+0

您在1.62秒内快速进行相关更改?我希望有人对此有一个答案,因为我也对它感兴趣,但我无法想象解决方案,因为通常在编译时不会更改代码。 – KRONWALLED

回答

2

这不是gulp.watch()在运行任务时没有看到。尽管gaze中有一个debounceDelay option,它可以防止在某个时间窗口内发生相同的事件,但它很短,所以不太可能会碰到它。您可以尝试将其设置为0,但这可能会导致比解决问题更多的问题。

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

Orchestrator的将确保每一项任务和每一个相关性的业务流程运行过程中即使您指定它运行超过一次运行一旦。 [...]如果您需要它多次运行任务,请等待编排结束(开始的回调),然后再次调用启动。

我其实可以通过模拟使用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')); 
}); 
+0

你的回答很酷,但如果我保存3个文件,我的构建需要15s。我将不得不等待45秒才能得到结果?在理想的世界中,我应该可以取消任务并再次运行它。我一直在寻找https://github.com/kingmotley/gulp-debounced-watch,它使用https://github.com/paulmillr/chokidar,但没有成功 – CESCO

+0

这不是一个理想的世界。您无法取消任务,并且在任务已经运行时无法启动任务。 (和debouncing不是问题,看我的答案。) –

+0

这很糟糕。必须有另一种选择!谢谢@Sven – CESCO