我将以下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