更好的gradle表达式为所有子项目执行fileTrees.add()

时间:2019-03-09 15:19:23

标签: android gradle

要将SpotBugs配置为Android build.gradle文件,以下表达式似乎无效。
我不擅长使用Groovy脚本,但是可能会有更好的方法。

tasks.withType(com.github.spotbugs.SpotBugsTask) {
    classes = fileTree("${project.buildDir}/intermediates/classes")
            .plus(fileTree("${rootProject.rootDir}/../subproject-one/app/build/intermediates/classes"))
            .plus(fileTree("${rootProject.rootDir}/../subproject-two/app/build/intermediates/classes"))
            .plus(fileTree("${rootProject.rootDir}/../subproject-three/app/build/intermediates/classes"))
}

实际上,所有子项目fileTree的目标都是${project.buildDir}/intermediates/classes的迭代子项目。

左侧的classesorg.gradle.api.file.FileCollection类型,指的是SpotBugs gradle plugin source code

我的审判如下;

    // not working
    classes = rootProject.subprojects.collect({
        proj -> fileTree("${proj.buildDir}/intermediates/classes") })
                        .stream().asType(org.gradle.api.file.FileCollection.class)

它给出了以下错误;

  

无法确定任务':app:spotbugsMain'的依赖关系。

     

>没有方法签名:java.util.stream.ReferencePipeline $ Head.getBuildDependencies()适用于参数类型:()值:[]

我知道为什么会出现这样的错误,但是我无法想象如何正确修复它。 我该如何实现?

1 个答案:

答案 0 :(得分:0)

假设SpotBugsTask具有您可以执行的setClasses(FileCollection)方法

tasks.withType(com.github.spotbugs.SpotBugsTask) {
   List<File> dirs = subprojects.collect { it.file("${it.buildDir}/intermediates/classes") } 
   classes = files(dirs) 
} 

请参阅iterating on a list的groovy文档