并行化gradle任务中的代码

时间:2016-05-21 11:07:54

标签: gradle

我有一项基本上执行以下操作的任务:

['subproj1', 'subproj2'].each { proj ->
    GradleRunner.create()
        .withProjectDir(file("./examples/${proj}/"))
        .withArguments('check')
        .build()
}

检查是系统测试,需要连接到第三方服务,所以我想将其并行化。

这可以在gradle中完成吗?如果是这样,怎么样?

我尝试使用java线程,但是构建失败并出现错误,我不记得它们究竟是什么,但是他们认为gradle内部状态已经损坏。

2 个答案:

答案 0 :(得分:2)

您是否尝试过使用实验并行任务?乍一看它非常简单。你只需要调用./gradlew --parallel检查(或者如果它可以正常工作,你也可以在你的gradle.properties中定义它)。这将启动n个线程(其中n是数字cpu核心),它将执行您的任务。每个线程都拥有一个项目,因此一个项目的任务永远不会并行执行。

您可以通过在命令行设置属性--max-workers或在gradle.properies上设置org.gradle.workers.max=n来覆盖任务(或工作人员)的数量。

如果您只是想要并行执行测试而不是尝试设置Test.setMaxParallelForks(int)。这将导致并行执行一个项目的测试(如果我理解这一点)(使用您定义的任务数)。

希望有所帮助。也许gradle文档为您提供了更多见解:https://docs.gradle.org/current/userguide/multi_project_builds.html#sec:parallel_execution

答案 1 :(得分:0)

虽然多项目构建是长期的正确方法,但我的短期方法是使用GPars:

import groovyx.gpars.GParsPool

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.codehaus.gpars:gpars:1.1.0"
    }
}

task XXXX << {
    GParsPool.withPool(10) {
        ['subproj1', 'subproj2'].eachParallel { proj ->
            GradleRunner.create()
                .withProjectDir(file("./examples/${proj}/"))
                .withArguments('check')
                .build()
        }
    }
}