Debug Gradle的并行模式

时间:2013-02-21 08:25:11

标签: gradle

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

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

UI模块(~20) - >分享用户 - >域名 - > dao - >框架

依赖性是单向的,构建是自下而上的。

不幸的是,我们的构建时间没有大幅提升。它与我们以前用蚂蚁得到的几乎相同。

以并行模式查看任务的执行顺序,很少有事情看起来不正确。 我们期望Gradle最初会在构建核心层时按顺序运行任务。因此,在它组装框架,dao,域和共享ui之后,它应该并行地执行其他所有操作。

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

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

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

我们花了很多时间使用gradle任务查看依赖项 - 这些模块的所有和测试任务完全独立,没有任何东西可以阻止它们的执行。

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

1 个答案:

答案 0 :(得分:3)

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

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