如何筛选子模块的gradle中运用适当的插件?

问题描述 投票:3回答:1

我有一个多模块项目,其中有些是Java库和其他的Android库。我想申请定制插件根据项目的类型我个子项目(模块),所以我做了这样的事情(见下面的代码片段)在我的项目根的build.gradle文件。这种设置是工作,但我不知道是否有这样做的任何其他方式。摇篮表明Filtering by properties,但我得到的错误Cannot add task 'integTest' as a task with that name already exists如果我试试。该integTest是我在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

android gradle android-gradle build.gradle
1个回答
1
投票

问题是,在你的project.afterEvaluate块你申请你的自定义脚本的gradle向root project而不是评估的sub project,这将导致已经定义与integTesttask错误。

你应该有类似如下的内容重写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
        }
    }

}

© www.soinside.com 2019 - 2024. All rights reserved.