自定义 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
循环来完成它。也许有更简单优雅的方法,我会尝试使用它,但这个解决方案已经足够好了。
我是 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
循环来完成它。也许有更简单优雅的方法,我会尝试使用它,但这个解决方案已经足够好了。