调试 Gradle 的并行模式



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

我们的代码库结构在如下的域层中:

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

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

不幸的是,我们的构建时间没有得到很大的提升。这和我们以前用蚂蚁得到的差不多。

看看并行模式下任务的执行顺序,很少有事情看起来不对劲。我们的期望是Gradle在构建核心层时,最初会按顺序运行任务。因此,在它组装了框架、dao、域和共享ui之后,它应该并行地启动其他一切。

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

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

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

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

我们想知道这是否是一个已知的问题,或者是否有一种方法可以在Gradle中启用一些额外的调试,以了解Gradle如何使用并行模式确定执行顺序。感谢您的帮助。

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

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

最新更新