【问题标题】:How to filter submodules in gradle to apply appropriate plugin?如何过滤 gradle 中的子模块以应用适当的插件?
【发布时间】:2019-02-06 04:46:15
【问题描述】:

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

【问题讨论】:

  • 您得到的错误表明您将customJavaBuild.gradlecustomAndroidBuild.gradle 应用到同一个子项目,由于任务integTest 名称冲突,这是不允许的。您可以根据“按属性过滤”分享您的解决方案吗? (至少你在根项目脚本中实现的逻辑,以及你如何在每个子项目中实现属性来确定项目类型)
  • @M.Ricciuti 感谢您的评论,我已在问题中添加了更多可能对您有所帮助的代码。
  • 我看到了问题。请尝试我的答案中描述的更改,这应该可以。

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


【解决方案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
        }
    }

}

【讨论】:

  • 由于它是在project.afterEvaluate 关闭下,我不知道我必须使用project.apply。感谢您的帮助。
猜你喜欢
  • 2021-10-24
  • 2015-11-01
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 2020-06-02
相关资源
最近更新 更多