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

标签 android gradle android-gradle-plugin build.gradle

我有一个多模块项目,其中一些是 Java 库,另一些是 Android 库。我想根据项目类型为我的子项目(模块)应用自定义插件,所以我在项目根目录的 build.gradle 文件中做了类似的事情(见下面的代码 fragment )。此设置有效,但我想知道是否还有其他方法可以做到这一点。 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)build.gradle 文件中有这个额外的属性ext.projectType = 'jar'

最佳答案

问题在于,在您的 project.afterEvaluate block 中,您将自定义 gradle 脚本应用于 root project 而不是评估的 sub project,这会导致 integTesttask already defined 的错误。

您应该使用类似于以下内容的内容重写您的 project.afterEvaluate block :

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
        }
    }

关于android - 如何过滤 gradle 中的子模块以应用适当的插件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54546763/

相关文章:

Android Kotlin - 捕获异常仍然使程序崩溃

android - strings.xml 文件中的 "msgid"和 "xliff"是什么?

安卓库 : Class file not found when "implementation project" is used for module dependency of a library

android - 为 SDK 24 构建安全吗?

android - 构建错误 Android : Configuration with name 'default' not found

android - 如何在 Windows 上为 Android 构建 gstreamer?

Android 运行时权限完成调用 Activity

gradle - 没有方法签名:静态org.akhikhl.gretty.ProjectUtils.getClassPath()

android - 为什么有些手机出现 "This app has been built with an incorrect configuration"错误?

Android Studio 3.1.1 CreateProcess error=206,文件名或扩展名太长