多层级配置Gradle项目JaCoCo覆盖率报告排除类的方法
解决Gradle约定插件与模块级JaCoCo排除规则叠加问题
问题根源在于你当前的写法是通过setFrom直接替换classDirectories集合,后配置的规则会覆盖前序配置(你遇到的约定插件规则生效、模块级不生效的情况,是因为配置阶段classDirectories.files尚未初始化,模块级的替换操作实际上没有生效,而约定插件的配置会在任务执行阶段延迟解析)。
以下两种方案可以实现多位置排除规则的叠加生效:
方案一:直接修改现有FileTree的排除规则
不替换整个classDirectories集合,而是对已有的ConfigurableFileTree添加排除规则,这样约定插件和模块级的规则会叠加生效。
约定插件代码(buildSrc/src/main/kotlin/mapstruct-conventions.gradle.kts)
// ...其他配置 tasks.jacocoTestReport { classDirectories.configure { files.forEach { fileTree -> (fileTree as ConfigurableFileTree).exclude("**/*MapperImpl*") } } }
模块级代码(database-jooq/build.gradle.kts)
plugins { id("mapstruct-conventions") } tasks.jacocoTestReport { classDirectories.configure { files.forEach { fileTree -> (fileTree as ConfigurableFileTree).exclude("**/jooq/generated/**") } } }
方案二:使用Gradle延迟配置API叠加规则
利用Gradle的Provider延迟解析特性,基于前序配置的结果叠加新的排除规则,确保两个位置的规则都能生效。
约定插件代码
// ...其他配置 tasks.jacocoTestReport { classDirectories = classDirectories.map { dirs -> dirs.files.flatMap { dir -> fileTree(dir).exclude("**/*MapperImpl*") } } }
模块级代码
plugins { id("mapstruct-conventions") } tasks.jacocoTestReport { classDirectories = classDirectories.flatMap { dirs -> dirs.files.flatMap { dir -> fileTree(dir).exclude("**/jooq/generated/**") } } }
关于afterEvaluate异常的说明
你遇到的IllegalMutationException是因为Gradle不允许在某些上下文(如插件配置块内部)调用afterEvaluate,上述方案无需依赖afterEvaluate即可解决问题,自然规避了该异常。
内容的提问来源于stack exchange,提问作者Martin Tarjányi
相关产品推荐
相关产品推荐

