Gradle多子项目如何单独运行infra模块test且不触发依赖库测试
解决方案
你可以通过以下两种配置方式实现需求,两种方式都不会影响gradlew test执行全模块测试的逻辑。
方案1:根目录全局配置(最匹配需求)
在项目根目录的build.gradle(Groovy DSL)中添加以下配置,Gradle会在任务构建图生成后自动判断当前执行场景,单独跑infra测试时自动禁用依赖库的测试任务:
gradle.taskGraph.whenReady { graph -> // 判断当前是否仅触发了infra模块的测试,未触发全局测试 boolean onlyRunInfraTest = graph.allTasks.any { it.path == ':app:infra:test' } && !graph.allTasks.any { it.path == ':test' } if (onlyRunInfraTest) { project(':app:libs:lib1').tasks.test.enabled = false project(':app:libs:lib2').tasks.test.enabled = false } }
如果你使用Kotlin DSL,对应写法如下:
gradle.taskGraph.whenReady { val onlyRunInfraTest = allTasks.any { it.path == ":app:infra:test" } && !allTasks.any { it.path == ":test" } if (onlyRunInfraTest) { project(":app:libs:lib1").tasks.named<Test>("test").configure { it.enabled = false } project(":app:libs:lib2").tasks.named<Test>("test").configure { it.enabled = false } } }
方案2:infra模块内直接移除测试依赖
如果无论什么场景下跑infra的测试都不需要触发依赖库的测试,可以直接在app/infra/build.gradle中移除test任务对依赖库测试的依赖:
tasks.named('test') { dependsOn.remove(project(':app:libs:lib1').tasks.test) dependsOn.remove(project(':app:libs:lib2').tasks.test) }
临时跳过方案
如果只是单次需要跳过依赖库的测试,可以直接在执行命令时添加-x参数排除指定任务:
gradlew app:infra:test -x :app:libs:lib1:test -x :app:libs:lib2:test
内容的提问来源于stack exchange,提问作者Simon Gruber
相关产品推荐
相关产品推荐

