我们正在为我们非常庞大而复杂的企业应用程序尝试Gradle。我们正在使用多个项目构建结构,并对Gradle的并行执行功能感到非常兴奋。Debug Gradle的并行模式
我们的代码库被域层结构是这样的:
UI模块(〜20) - >共享UI - >域 - >道 - >框架
依存关系是单向的,并构建发生自下而上。
不幸的是,我们并没有看到在我们的构建次大的推动作用。它与我们之前用蚂蚁得到的结果几乎相同。
望着任务并行模式几件事的执行顺序看起来不正确的。 我们的期望是,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使用任务的依赖性--all并为这些模块测试任务是完全独立的,并没有什么应该推迟其执行。
我们想知道,如果这是一个已知的问题或是否有一种方法,使在摇篮一些额外的调试,以获得更多的洞察力摇篮如何确定并行方式执行顺序。任何帮助表示赞赏。
**特别是,随时执行的一组任务不会包含属于同一个项目的两个任务。** 这是非常有用的信息。那么,并行模式下项目的任务粒度是多少?检查被认为是一个任务或测试或pmd是任务?它在根项目和子项目之间有什么不同? 不幸的是,对我们来说** maxParallelForks **根本不起作用。我们已经尝试将其设置为最小有用值2,并且构建失败。它很快就会在OSX上遇到“系统中打开的文件过多”错误。 – abhi 2013-02-22 01:51:17
任务的粒度总是相同的。所有的'check','test','pmd'都是任务(实际上我认为它是'pmdMain')。根项目和子项目没有区别。当然,并行化时要考虑任务图,但还要强制执行同一项目中没有两个任务可以并行运行的限制。你正在使用哪个Gradle版本?如果您遇到'maxParallelForks'问题,请在http://forums.gradle.org上报告。也尝试增加打开文件的最大数量(应该很容易在* nix上)。 – 2013-02-22 07:11:07