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