[英]How to filter submodules in gradle to apply appropriate plugin?
我有一個多模塊項目,其中一些是Java庫和其他Android庫。 我想根據項目類型為我的子項目(模塊)應用自定義插件,所以我在項目root的build.gradle
文件中做了類似的事情(見下面的代碼片段)。 這個設置正在運行,但我想知道是否還有其他方法可以做到這一點。 Gradle建議按屬性過濾,但我收到錯誤Cannot add task 'integTest' as a task with that name already exists
如果我嘗試的話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
塊中,您將自定義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
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.