gulp在运行之前如何解决依赖关系?

时间:2014-03-08 02:48:32

标签: gulp

假设有四个任务'a','b','c','d'(b取决于c和d; c和d都取决于a),因此任务按以下顺序运行:< / p>

A-&GT; (c,d) - &gt; B'/ P>

这是相应的gulpfile.js:

gulp.task('a');
gulp.task('c', ['a']);
gulp.task('d', ['a']);
gulp.task('b', ['c', 'd']);

尽管任务'c'和'd'都依赖于任务'a',但gulp足够聪明,只能执行一次'a'任务。我想知道,因为任务以最大并发性运行,gulp如何在运行之前解决依赖关系?

2 个答案:

答案 0 :(得分:7)

记录它的一种更好的方法是“gulp(orchestrator)在考虑所有指定的依赖关系之后以最大可能的并发运行。”

那么在您的场景中,c和d实际上是“并行”运行吗?嗯,是的,不。因为JavaScript是单线程的,所以从技术上讲,处理器可以执行c或d,但不能同时执行两者。 Gulp(orchestrator)将启动a,等待它完成,然后启动c和d,等待两者完成,然后启动b。

如果任务c和d完全异步,您将看到两者同时执行。 (注意gulp时序输出交织在一起。)如果任务是完全同步的,从技术上讲,它们不会“并行”运行......只是因为JavaScript是单线程的。

这是最大的可能的并发性,可以解释您指定的所有限制。

答案 1 :(得分:2)

如果任务具有依赖性,

gulp任务似乎并不总是以最大并发运行。 gulp's documentation说:

  

注意:默认情况下,任务以最大并发性运行 - 例如它   立即启动所有任务并等待一切。如果你想   创建一个系列,其中任务以特定顺序运行,您需要这样做   两件事:

     
      
  • 在任务完成时给它一个暗示告诉它,
  •   
  • 并提示任务取决于另一个任务的完成情况。
  •   

gulp使用orchestrator运行任务,orchestrator使用sequencify按顺序排列任务。

例如,您的示例中的任务将按顺序排列为a -> c -> d -> ba -> d -> c -> b,并由orchestrator按顺序执行。

如果我理解正确,c和d可以在理论上并行执行,但不能与当前的gulp实现一起执行。

修改

orchestrator似乎并行运行c和d。它按顺序循环执行任务,并运行未完成或正在运行且其依赖性全部完成的任务。它重复完成每项任务,直到完成所有任务。有关详细信息,请参阅Orchestrator.prototype._runStep