3

我们正在为我们非常庞大和复杂的企业应用程序尝试 Gradle。我们正在使用多项目构建结构,并且对 Gradle 的并行执行功能感到非常兴奋。

我们的代码库是在领域层中构造的,如下所示:

UI 模块 (~20) -> 共享 ui -> 域 -> dao -> 框架

依赖关系是单向的,构建发生自下而上。

不幸的是,我们没有看到我们的构建时间有很大的提升。它与我们之前使用 ant 得到的几乎相同。

查看并行模式下任务的执行顺序,几乎没有什么不对劲的地方。我们的期望是 Gradle 在构建核心层时最初会按顺序运行任务。因此,在它组装了框架、dao、域和共享 ui 之后,它应该并行踢其他所有东西。

但是我们看到的执行顺序有点像这样:

framework.assemble -> dao.assemble -> domain.assemble -> shared.ui.assemble -> 其他 UI modules.assmble(并行)-> war -> 其他 UI.check + shared.ui.check + dao.check (并行)-> domain.check -> framework.check

当它按顺序而不是并行运行域和框架检查时,瓶颈处于最后。这两个模块对我们来说是最大的模块,大约有 12k 单元测试,它们大约需要 4 分钟才能运行。

我们花了很多时间使用 gradle 任务查看依赖关系——这些模块的所有和测试任务都是完全独立的,没有什么可以阻止它们的执行。

我们想知道这是否是一个已知问题,或者是否有办法在 Gradle 中启用一些额外的调试,以便更深入地了解 Gradle 如何确定并行模式下的执行顺序。任何帮助表示赞赏。

4

1 回答 1

3

从 Gradle 1.4 开始,并行任务的执行(有意)受到了一些限制。特别是,在任何时候执行的任务集都不会包含属于同一个项目的两个任务。随着时间的推移,这将得到改善。--debug除了从日志中获得的信息(例如,使用)之外,我不知道有任何调试帮助。

请注意,并行测试执行是一个单独的功能。如果您在同一个项目中有很多测试,test.maxParallelForks = xx > 1 应该会显示出明显的加速。x 的值最好通过实验确定。一个好的起点是机器上的物理内核数(例如Runtime.getRuntime().availableProcessors() / 2)。

于 2013-02-21T08:47:34.803 回答