Gradle 在梯度任务中并行化代码

Gradle 在梯度任务中并行化代码,gradle,Gradle,我有一项任务,主要执行以下任务: ['subproj1', 'subproj2'].each { proj -> GradleRunner.create() .withProjectDir(file("./examples/${proj}/")) .withArguments('check') .build() } 该检查是一个系统测试,需要连接到第三方服务,因此我想将其并行化 这能在格拉德尔做到吗?如果是,怎么做 我尝试使用jav

我有一项任务,主要执行以下任务:

['subproj1', 'subproj2'].each { proj ->
    GradleRunner.create()
        .withProjectDir(file("./examples/${proj}/"))
        .withArguments('check')
        .build()
}
该检查是一个系统测试,需要连接到第三方服务,因此我想将其并行化

这能在格拉德尔做到吗?如果是,怎么做


我尝试使用java线程,但构建失败,出现了错误,我记不清它们到底是什么,但它们表明gradle内部状态已损坏。

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

通过在命令行中设置属性
--max workers
,或者在gradle.properties中设置
org.gradle.workers.max=n
,可以覆盖任务(或工作者)的数量

如果您只是对并行执行测试感兴趣,那么可以尝试设置
Test.setMaxParallelForks(int)
。这将导致并行执行一个项目的测试(如果我理解正确的话)(与您定义的任务数量相同)


希望有帮助。也许gradle文档给了您更多的见解:

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

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()
        }
    }
}
导入groovyx.gpars.GParsPool
构建脚本{
存储库{
mavenCentral()
}
依赖关系{
类路径“org.codehaus.gpars:gpars:1.1.0”
}
}
任务XXXX
GradleRunner.create()
.withProjectDir(文件(“./examples/${proj}/”)
.withArguments('check'))
.build()
}
}
}

我已经看到了这个参数,但不幸的是,这似乎要求将项目设置为多项目构建,而我的不是。也许我需要重构,但如果它们不是多项目,你可以完全独立地运行它们。如果您调用gradle,那么您这样做是为了构建一个项目(可能包含多个不同的子项目)。我只是建议它们是多项目构建,因为您将它们命名为subproject[1,2,3]。也许您可以分享一些关于如何设置的更多见解。一个大项目包含很多子项目并不总是一个好主意。我的经验法则是:如果某个软件有一个生命周期(构建、发布、部署),那么它应该是一个独立的项目。顶层构建文件的主要目的是测试examples/*中的独立项目。示例项目的目的是尽可能独立,这样,只需将示例移到其他地方即可重复使用。我刚刚将您的构建修改为多项目设置。请查看此拉取请求: