首页 > 解决方案 > 更好的 gradle 表达式为所有子项目执行 fileTrees.add()

问题描述

要将SpotBugs配置为 Androidbuild.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 插件源代码

我的试验如下;

    // 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() 适用于参数类型:() 值:[]

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

标签: androidgradle

解决方案


假设 SpotBugsTask 有一个你可以做的 setClasses(FileCollection) 方法

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

请参阅 groovy 文档以迭代列表


推荐阅读