我有一个多模块项目,其中一些是 Java 库,另一些是 Android 库。我想根据项目类型为我的子项目(模块)应用自定义插件,所以我在项目根目录的 build.gradle
文件中做了类似的事情(见下面的代码 fragment )。此设置有效,但我想知道是否还有其他方法可以做到这一点。 Gradle 建议 Filtering by properties但是我得到错误 Cannot add task 'integTest' as a task with that name already exists
如果我尝试这样做。 integTest
是我在 customJavaBuild.gradle
和 customAndroidBuild.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
,这会导致 integTest
task 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/