如何修复错误';无法锁定buildSrc build lock,因为它已被此进程锁定;带Gradle5和GradleBuild任务

如何修复错误';无法锁定buildSrc build lock,因为它已被此进程锁定;带Gradle5和GradleBuild任务,gradle,Gradle,我们有一个GradleBuild,它动态创建几个GradleBuild类型的任务,以与不同的客户端库版本一起运行,以测试其兼容性。这在Gradle4上运行得很好,但在移动到Gradle5后,我发现无法锁定buildSrc build lock,因为它已被此进程锁定。执行第一个任务后出错。所以目录被第一次构建锁定,并且不会被释放。你能告诉我怎么解决这个问题吗? 是这样的 task testAll { dependsOn clientVersions.collect { "runTests

我们有一个GradleBuild,它动态创建几个GradleBuild类型的任务,以与不同的客户端库版本一起运行,以测试其兼容性。这在Gradle4上运行得很好,但在移动到Gradle5后,我发现
无法锁定buildSrc build lock,因为它已被此进程锁定。
执行第一个任务后出错。所以目录被第一次构建锁定,并且不会被释放。你能告诉我怎么解决这个问题吗? 是这样的

task testAll {
    dependsOn  clientVersions.collect { "runTestsWithClient$it" }
    clientVersions.forEach { version ->
        task "runTestsWithClient$version"(type: GradleBuild) {
            buildFile = "build.gradle"
            tasks = ["testClient"]
            startParameter.projectProperties = [clientVersion: version]
        }
    }
}

我建议不要在单独的
GradleBuild
任务中运行这些测试。我宁愿尝试从共享任务模板为每个测试设置一个本地
测试
任务;这些
Test
任务只会在测试类路径中有所不同

为了确保不同的客户端版本依赖关系不会相互干扰,我将为它们中的每一个生成单独的配置,并在这些配置上添加依赖关系

下面是一个应用Gradle 5.6.1(可能更早)的基本示例:


如果您对如何工作有任何疑问,请告诉我。

只是想知道:为什么您需要为每个测试任务运行单独的Gradle构建?为什么不简单地创建不同的
testClient
任务变体并运行它们呢?因为要测试的客户端库的数量和版本是动态的,并且是从外部源解析的。因此,不可能有静态任务。另外,示例中的每个任务都使用特定版本的依赖关系:(嗯,我不确定我是否理解您所说的“示例中的每个任务都使用特定版本的依赖关系”的意思。您是否可以说明
testClient
的作用?没有什么特别的,它从一个类执行测试:```任务testClient(type:Test){filter{includeTestsMatching“*.ClientCompatibilityTest”}}``诀窍是将参数设置为特定的依赖项版本
startParameter.projectProperties=[clientVersion:version]
并且依赖项类似于
testCompile组:“xxxxx”,名称:“client all”,version:project.clientVersion
谢谢,它看起来很优雅!这样重构了t,但现在在编译任务中出现错误,我的依赖项中的类是未解析的引用。检查了任务的类路径
println(classpath.asFileTree.files)
并且它确实包含正确的jar版本,并且文件系统上存在文件。尝试调试它看起来像是添加了DEP,但是这个类路径没有应用到编译步骤上啊抱歉,在移动到gradle5后是IDE问题,继续修复否,不幸的是现在无法使它工作,它看起来像是de中的类找不到依赖项,这是编译错误。您可能知道为什么jar在这个类路径中,但没有找到它们?感谢Advanced上次解决了这个问题。不仅需要将配置作为类路径添加到测试任务的依赖项中,因为它只是运行时。而且我还必须将客户端依赖项添加到testCompileOnly配置中,以获得这个cla因此在运行时有特定版本的客户端libs,并固定在编译阶段
testCompileOnly组:“xxxx”,名称:“client”,版本:“xxx”
plugins {
    id 'java'
}

repositories {
    ivy {
        url = 'file:///tmp/my-repo'
    }
    jcenter()
}

dependencies {
    testImplementation 'junit:junit:4.12'
}

def clientVersions = [1, 2, 3]

task('testAll')

clientVersions.each { v ->
    def configName = "myConfig$v"
    def config = configurations.create(configName)
    dependencies.add(configName, "com.example:foo:$v")

    def taskName = "testClient$v"
    task(taskName, type: Test) {
        classpath += config
        // TODO use other shared test configuration such as:
        // filter { includeTestsMatching "*.ClientCompatibilityTest" }
    }
    testAll.dependsOn taskName
}