我已经将以下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中有效。
答案 0 :(得分:1)
您需要在settings.gradle
中应用插件,我相信在最近的版本中支持该插件。