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