如何通过编程方式获取Gradle的目标任务?
仅在运行jacocoTestReport时应用Jacoco插件的实现方案
你之前的代码问题在于初始化阶段无法获取最终的任务图,gradle.targets并不是正确的API,此时Gradle还没完成任务依赖解析。要实现按需应用插件,需要借助Gradle的任务图就绪回调来判断目标任务:
gradle.taskGraph.whenReady { taskGraph -> // 判断任务图中是否包含jacocoTestReport任务(根项目用:jacocoTestReport,子项目替换为对应路径) if (taskGraph.hasTask(":jacocoTestReport")) { apply<JacocoPlugin>() // 配置jacocoTestReport任务 tasks.named<JacocoReport>("jacocoTestReport") { dependsOn("test") reports { xml.required.set(true) } } // 必须启用test任务的Jacoco代理,否则无法生成覆盖数据 tasks.named<Test>("test") { jacoco { enabled = true } } } }
关键说明:
- 任务图就绪回调:
gradle.taskGraph.whenReady会在Gradle完成任务依赖解析、确定最终要执行的任务列表后触发,此时能准确判断目标任务是否存在。 - 任务路径匹配:
hasTask方法需要传入完整的任务路径,单模块项目用:jacocoTestReport,多模块项目要写成:子项目名称:jacocoTestReport;如果想忽略路径直接匹配任务名,可以用taskGraph.allTasks.any { it.name == "jacocoTestReport" }。 - Test任务配置:启用Jacoco插件后,必须显式打开test任务的jacoco开关,否则测试不会生成覆盖数据,最终报告为空。
这样执行gradle test时,任务图中没有jacocoTestReport,插件不会被应用,测试也不会加载Jacoco代理,速度不受影响;执行gradle jacocoTestReport时,才会触发插件应用和Jacoco配置,生成测试覆盖报告。
内容的提问来源于stack exchange,提问作者caeus
相关产品推荐
相关产品推荐

