如何在gradle中过滤子模块以应用适当的插件?

时间:2019-02-06 04:46:15

标签: android gradle android-gradle build.gradle

我有一个多模块项目,其中一些是Java库,另外一些是Android库。我想根据项目类型为子项目(模块)应用自定义插件,因此我在项目根目录的build.gradle文件中做了类似的事情(请参见下面的代码片段)。此设置正在运行,但我想知道是否还有其他方法可以执行此操作。 Gradle建议使用Filtering by properties,但如果尝试这样做,则会收到错误Cannot add task 'integTest' as a task with that name already existsintegTest是我在customJavaBuild.gradlecustomAndroidBuild.gradle文件中创建的任务。任何帮助表示赞赏。谢谢!

def javaLibraries = ["projA", "projB"]
def androidLibraries = ["projC"]

subprojects {
    if (javaLibraries.contains(it.name)) {
        apply from: '$rootDir/gradle/customJavaBuild.gradle'
    } else if (androidLibraries.contains(it.name)) {
        apply from: '$rootDir/gradle/customAndroidBuild.gradle'
    } else {
        //Apply custom plugin for some other project type.
    }
} 

按属性过滤

subprojects {
    project.ext {
        projectType = null
    }

    project.afterEvaluate {
        if (project.ext.projectType == 'jar') {
            apply from: '$rootDir/gradle/customJavaBuild.gradle'
        } else if (project.ext.projectType == 'aar') {
            apply from: '$rootDir/gradle/customAndroidBuild.gradle'
        } else {
            //Apply custom plugin for some other project type.
        }
    }
}

我的子模块(projA,projB,projC)ext.projectType = 'jar'文件中有这个额外的属性build.gradle

1 个答案:

答案 0 :(得分:1)

问题在于,在您的project.afterEvaluate块中,您将自定义gradle脚本应用于root project而不是应用于求值的sub project,这会导致integTest错误任务已经定义。

您应使用类似于以下内容的方法重写project.afterEvaluate块:

subprojects {
    project.ext {
        projectType = null
    }

    project.afterEvaluate {
        if (project.ext.projectType == 'jar') {
            // WARNING : use "project.apply ..." instead of "apply ..." here
            project.apply from : "$rootDir/gradle/customJavaBuild.gradle"
        } else if (project.ext.projectType == 'aar') {
            project.apply from : "$rootDir/gradle/customAndroidBuild.gradle"
        } else {
            // nothing
        }
    }

}