我有一项基本上执行以下操作的任务:
['subproj1', 'subproj2'].each { proj ->
GradleRunner.create()
.withProjectDir(file("./examples/${proj}/"))
.withArguments('check')
.build()
}
检查是系统测试,需要连接到第三方服务,所以我想将其并行化。
这可以在gradle中完成吗?如果是这样,怎么样?
我尝试使用java线程,但是构建失败并出现错误,我不记得它们究竟是什么,但是他们认为gradle内部状态已经损坏。
答案 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()
}
}
}