gradle - jacocoRootReport仅显示多项目gradle构建的最后一个项目的覆盖范围

标签 gradle build.gradle jacoco jacoco-plugin

我正在将Gradle 4多项目安装程序升级到Gradle6。我在这里按照说明进行操作:

https://stackoverflow.com/a/56181389

并且我已经将jacoco版本更改为0.8.5。目前唯一的问题是,人类可读的覆盖率报告似乎丢失了旧版本下显示的大多数覆盖率数据。覆盖率报告似乎仅反射(reflect)了最近(最近测试)的项目。过去在Gradle 4下可以正常工作。我正在使用Java 8。

我使用--debug运行gradle构建,并且我注意到test.exec文件被重复删除,对于每个具有测试的子项目一次。我认为这是问题所在,但我不知道如何防止删除此文件。

2020-04-16T09:16:21.048-0600 [DEBUG] [org.gradle.internal.file.impl.DefaultDeleter] Deleting /Users/bishop/dev/aep/edge-profile-lookup-target/build/jacoco/test.exec

有人可以帮我解决这个问题,以便所有覆盖范围(针对每个子项目的每个测试)都显示在一个覆盖率报告中吗?

以下是build.gradle主文件中似乎相关的部分:
buildscript {
    ext {
        jacocoVersion = '0.8.5'
        ...
    }
    ...
}

allprojects {
    ...
    apply plugin: 'jacoco'
    ...
}

subprojects {
    tasks.withType(Test) {
        // redirect all coverage data to one file
        jacoco {
            destinationFile = file("$rootProject.buildDir/jacoco/test.exec")
        }
    }
    jacoco {
        toolVersion = jacocoVersion
    }

    jacocoTestReport {
        additionalSourceDirs.from = files(sourceSets.main.allSource.srcDirs)
        sourceDirectories.from = files(sourceSets.main.allSource.srcDirs)
        classDirectories.from = files(sourceSets.main.output.collect {
            fileTree(dir: it, exclude: project.properties['BUILD_COVERAGE_EXCLUSIONS'].tokenize(','))
        })
        reports {
            html.enabled = true
            xml.enabled = true
            csv.enabled = false
        }
    }
}

task jacocoRootReport(type: JacocoReport) {
    dependsOn = subprojects.test
    additionalSourceDirs.from = files(subprojects.sourceSets.main.allSource.srcDirs)
    sourceDirectories.from = files(subprojects.sourceSets.main.allSource.srcDirs)
    classDirectories.from = files(subprojects.jacocoTestReport.classDirectories)
    executionData.from = files(subprojects.jacocoTestReport.executionData)
    reports {
        html.enabled = true
        xml.enabled = true
        csv.enabled = false
    }
    onlyIf = {
        true
    }
    doFirst {
        executionData.from = files(executionData.findAll {
            it.exists()
        })
    }
}

...
apply plugin: 'jacoco'

configurations.create("jacoco")

configurations {
    jacoco
}

dependencies {
    jacocoAnt group: 'org.jacoco', name: 'org.jacoco.ant', version: jacocoVersion
    jacocoAnt group: 'org.ow2.asm', name: 'asm', version: asmVersion
}

task copyRuntimeLibs(type: Copy) {
    from configurations.jacoco
    into "$rootProject.buildDir/libs"
}

build.dependsOn copyRuntimeLibs

最佳答案

以下:

jacoco {
    destinationFile = file("$rootProject.buildDir/jacoco/test.exec")
}

将Jacoco配置为始终使用相同的输出文件。

因此,问题很可能是最新的Gradle版本可用于分离冲突输出。

我建议查看有关如何在多项目中设置Jacoco的recently published sample,而不是尝试依赖冲突的输出。

关于gradle - jacocoRootReport仅显示多项目gradle构建的最后一个项目的覆盖范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61237936/

相关文章:

java - 解决gradle依赖关系期间的Eclipse错误

android - compileSdkVersion、minSdkVersion、targetSdkVersion 应该怎么设置才能支持Marshmallow to Pie?

Android appcompat-v7 :21 error building gradle

sonarqube - Sonar Jacoco 排除 sonar.jacoco.excludes 导致 0% 覆盖而不是忽略。

gradle - 如何将多个Gradle脚本调用到其他Gradle脚本中

由于输出 jar 库为空,Android Studio proguardRelease FAILED

android - 在build.gradle中导出环境变量

jacoco在使用ant时不排除类

启用 Jacoco 时,具有默认方法的 Java 8 接口(interface)不起作用

java - gradle 将子项目返回为 null