0

我是 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----------------------
[]

根本没有排除目录。

4

1 回答 1

0

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

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

不要问我 Gradle 是如何包装它的,因为它不是 Groovy 语法,但它可以工作。我的观点是 Gradle 以某种方式实现AntlrTask为模式匹配器,因为它实现了接口“PatternFilterable”并且文档提到了 Ant。我试图用纯 Groovy 解决它,PatternSet这是另一个实现的类PatternFilterable,但我没有成功。

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

于 2020-07-22T12:25:40.390 回答