我已经破解了 build.gradle
的组合和 settings.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
调用插件在 Gradle 1.11 或 1.12 中不起作用,但在 Gradle 2.0 中起作用。
最佳答案
您需要在 settings.gradle
中应用插件,我相信在最近的版本中是支持的。
关于gradle - Gradle 插件可以修改多模块项目中的子项目列表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24813415/