我將以下build.gradle
和settings.gradle
的組合組合在一起,用於創建多個單模塊項目中的臨時多模塊項目(例如,應用程序及其所有依賴項或共享庫以及所有使用該模塊的項目圖書館)。Gradle插件可以修改多模塊項目中的子項目列表嗎?
settings.gradle
:
// find all subprojects and include them
rootDir.eachFileRecurse {
if (it.name == "build.gradle") {
def projDir = it.parentFile
if (projDir != rootDir) {
include projDir.name
project(":${projDir.name}").projectDir = projDir
}
}
}
build.gradle:
:
// Make sure we've parsed subproject dependencies
evaluationDependsOnChildren()
// Map of all projects by artifact group and name
def declarationToProject = subprojects.collectEntries { p -> [toDeclaration(p), p] }
// Replace artifact dependencies with subproject dependencies, if possible
subprojects.each { p ->
def changes = [] // defer so we don't get ConcurrentModificationExceptions
p.configurations.each { c ->
c.dependencies.each { d ->
def sub = declarationToProject[[group:d.group, name:d.name]]
if (sub != null) {
changes.add({
c.dependencies.remove(d)
p.dependencies.add(c.name, sub)
})
}
}
}
for (change in changes) {
change()
}
}
這工作,但很難分享 - 如果別人想要做類似他們要複製我*.gradle
文件或削減的東西,糊。
我想要做的就是把這個功能封裝在一個插件中。 build.gradle
部分看起來很容易在插件apply()
方法中完成,但似乎在插件獲得機會之前,子項目列表已經設置完畢。有沒有什麼辦法可以在構建過程的早期進入,例如通過申請除Project
以外的東西?或者我應該辭職給我的插件一個覆蓋settings.gradle
的任務?
解決方案:每Peter Niederweiser's answer,我提出上面的代碼爲兩個插件,一個從settings.gradle
稱爲和其他從build.gradle
被調用。在settings.gradle:
buildscript {
repositories { /* etc... */ }
dependencies { classpath 'my-group:my-plugin-project:1.0-SNAPSHOT' }
}
apply plugin: 'find-subprojects'
而且在build.gradle:
buildscript {
repositories { /* etc... */ }
dependencies { classpath 'my-group:my-plugin-project:1.0-SNAPSHOT' }
}
evaluationDependsOnChildren()
apply plugin: 'local-dependencies'
注意,從settings.gradle
調用插件不會在搖籃1.11或1.12的工作,但確實在搖籃2.0工作。
我已經接近100%確定您只能在您的設置文件中執行此操作,至少使用當前的Gradle 1.x/2.x版本。當然,你總是可以分叉Gradle並提交一個pull請求。 :) – superEb