我将下面的内容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
部分看起来很容易在pluginapply()
方法中完成,但是在插件获得机会之前,子项目列表似乎已经定下来了。有什么方法可以进入构建过程的更早阶段,例如,通过应用除之外的其他东西Project
?还是应该辞职给插件执行覆盖任务settings.gradle
?
解决方案:根据Peter Niederweiser的回答,我将上面的代码移动到了两个插件中,一个从中调用,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
,我认为最新版本支持该插件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句