自定义 JaCoCo Gradle 插件 - 在报告中排除文件

Custom JaCoCo Gradle Plugin - exclude files in report

我是 Gradle 和 Groovy 的新手。 我的 build.gradle 文件中有这样的内容:

jacocoTestReport {
    afterEvaluate {
        classDirectories.setFrom(files(classDirectories.files.collect {
            fileTree(dir: it, exclude: ['aaa/bbb.*', 'ccc/ddd/*',])
        }))
    }
}

现在,我的自定义插件中需要这个。但我不确定如何设置这些排除项。 我有这样的东西:

project.afterEvaluate { p ->
    def reportTask = project.tasks.findByName('jacocoTestReport') as JacocoReport
    reportTask.classDirectories.setFrom(reportTask.classDirectories.files.) // Now what?
}

我被困在这里。你能帮我解决这个问题吗?

编辑 1:

我尝试使用 patternSet 来解决它。

println '----------------BEFORE REPORT----------------------'
def patternSet = new PatternSet()
def filesAsString = reportTask.classDirectories.files.collect { file ->
    file.path
}
patternSet.setIncludes(filesAsString)
patternSet.setExcludes(['aaa/bbb.*', 'ccc/ddd/*'])
def excludeFiles = reportTask.classDirectories.asFileTree.matching(patternSet).files
println filesAsString
println excludeFiles
def files = reportTask.classDirectories.asFileTree.minus(excludeFiles)
reportTask.classDirectories.setFrom(files)
println '----------------AFTER REPORT----------------------'
println reportTask.classDirectories.files

结果不是我所期望的:

----------------BEFORE REPORT----------------------
[aaa\bbb\build\classes\java\main, aaa\bbb\build\classes\groovy\main, aaa\bbb\build\resources\main]
[]
----------------AFTER REPORT----------------------
[]

完全没有排除目录。

所以,我以某种方式解决了它。

def ex = ['aaa/bbb/*','ccc/ddd.*','eee/fff/*']
def ft = reportTask.classDirectories.asFileTree.matching {
    ex.each {
        exclude it
    }
}

不要问我 Gradle 是如何包装它的,因为它不是 Groovy 语法,但它确实有效。 我的观点是 Gradle 以某种方式将 AntlrTask 实现为模式匹配器,因为它实现了接口 'PatternFilterable' 并且文档中提到了 Ant。我尝试使用 PatternSet 在纯 Groovy 中解决它,这是另一个 class 实现 PatternFilterable 但我没有成功。

但是简单的 exclude 'aaa/bbb/*' 工作正常。它不需要列表,所以我不得不使用 forEach 循环来完成它。也许有更简单优雅的方法,我会尝试使用它,但这个解决方案已经足够好了。