【问题标题】:How does gulp resolve dependencies before running?gulp 如何在运行前解决依赖关系?
【发布时间】:2014-03-08 02:48:32
【问题描述】:

假设有 'a', 'b', 'c', 'd' 四个任务(b 依赖于 c 和 d;c 和 d 都依赖于 a),因此任务按以下顺序运行:

a-> (c, d) -> b

这是相应工作的 gulpfile.js:

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

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

【问题讨论】:

    标签: gulp


    【解决方案1】:

    也许一种更好的记录方式是“在考虑所有指定依赖项后,gulp(协调器)以最大可能并发运行。”

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

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

    这是最大可能并发,考虑到您指定的所有限制。

    【讨论】:

    • 我发现一个gulp issue很好地解决了相关问题,对于任何有类似问题的人,您可以参考github.com/gulpjs/gulp/issues/96中的robrich的回答。
    【解决方案2】:

    如果任务有依赖关系,gulp 任务似乎并不总是以最大并发运行。 gulp's documentation 说:

    注意:默认情况下,任务以最大并发运行——例如它 立即启动所有任务并且什么都不等待。如果你想 创建一个系列,其中任务按特定顺序运行,你需要做 两件事:

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

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

    例如,您示例中的任务将通过 sequencify 排列到 a -> c -> d -> ba -> d -> c -> b 并由 Orchestrator 按顺序执行。

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

    编辑

    orchestrator 似乎并行运行 c 和 d。它按顺序循环执行任务,并运行未完成或正在运行且依赖关系已完成的任务。当每个任务完成时,它会重复,直到所有任务都完成。详情请见Orchestrator.prototype._runStep

    【讨论】:

    • 我在您指定的方向上找到了代码。非常感谢。 :)
    猜你喜欢
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 2023-03-11
    • 2014-03-12
    • 2022-11-18
    • 2014-12-18
    相关资源
    最近更新 更多