Gradle执行webservices项目测试时如何排除依赖项目core的测试执行?
嗨Markus,我来帮你搞定这个头疼的问题~
从你补充的core项目构建配置来看,问题的根源很明确:你的core项目把jar任务默认依赖了test任务。当webservices项目测试需要用到core的jar包时,Gradle会自动触发core项目里jar的前置任务——也就是test,这就导致了每次跑webservices的测试,core的所有测试都会跟着跑一遍。
下面给你几个可行的解决办法,按从易到难的顺序来:
一、临时快速解决:命令行加参数跳过core测试
你已经在core项目里预留了RUN_TESTS_FOR_JAR这个属性,直接在执行webservices测试时带上这个参数就能让core跳过测试:
/opt/gradle/gradle-7.5.1/bin/gradle webservices:test --tests com.example.MyTests.test -DRUN_TESTS_FOR_JAR=false
这样core会执行updateTestTimestamps但跳过test任务,完美符合你想要的效果,适合临时调试用。
二、永久解决:修改core项目的构建逻辑
如果不想每次都敲命令行参数,就调整core项目里的jar依赖逻辑,让test任务只在直接执行core自己的构建/测试时才触发,被其他项目依赖时自动跳过:
if (project.hasProperty("RUN_TESTS_FOR_JAR") && RUN_TESTS_FOR_JAR.equals("false")) { println "Tests are skipped!..." jar.dependsOn(updateTestTimestamps) } else { // 只有当前任务图里包含core自己的test任务时,才让jar依赖test if (gradle.taskGraph.hasTask(':core:test')) { jar.dependsOn(test, updateTestTimestamps) } else { jar.dependsOn(updateTestTimestamps) } }
这样当webservices依赖core的jar时,不会触发core的测试;只有你直接运行core:test或core:build时,才会执行core的测试。
三、另一种思路:调整webservices的依赖配置
如果webservices的测试只需要core的生产代码,不需要core的测试相关内容,可以直接指定依赖core的runtimeElements配置(Gradle默认的生产代码配置),这样不会触发core的测试任务:
dependencies { implementation project(path: ':core', configuration: 'runtimeElements') }
这个方案的前提是webservices确实不需要core的测试代码或测试依赖,适合依赖关系明确的场景。
你可以先试试第一种方法快速验证,再根据自己的长期需求选择后面的方案~
备注:内容来源于stack exchange,提问作者Clueless

