我有一个多模块项目,其中有些是Java库和其他的Android库。我想申请定制插件根据项目的类型我个子项目(模块),所以我做了这样的事情(见下面的代码片段)在我的项目根的build.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
。
问题是,在你的project.afterEvaluate
块你申请你的自定义脚本的gradle向root project
而不是评估的sub project
,这将导致已经定义与integTest
task错误。
你应该有类似如下的内容重写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
}
}
}