从elastic-deps开始,在这个答案的帮助下(也来自Peter),我想出了下面的技巧。
在顶层 build.gradle() 中:
// make sure we've parsed the subproject dependencies
evaluationDependsOnChildren()
def subprojectsByName = subprojects.collectEntries { it -> [it.name, it] }
subprojects.each { p ->
def hacks = [] // list of changes we're going to make
p.configurations.each { c ->
c.dependencies.each { d ->
if (d.group.startsWith("my.group.prefix")) {
def sub = subprojectsByName[d.name]
if (sub != null) {
hacks.add({
// can't do this immediately or we'll get ConcurrentModificationExceptions
c.dependencies.remove(d)
p.dependencies.add(c.name, sub)
})
}
}
}
}
// Now we can safely apply the changes
for (hack in hacks) {
hack()
}
}
这样做的好处是,与elastic-deps不同,您不必修改子项目。
这仍然存在一个问题,一旦您遇到二进制依赖项,任何纯粹的传递依赖项都会被解析为二进制。例如,假设我有一个项目cyan
,它直接依赖于green
并blue
传递地,通过green
, on yellow
:
compile - Compile classpath for source set 'main'.
+--- my.shared:blue:+ -> 2.0-SNAPSHOT
+--- my.shared:green:+ -> 2.0-SNAPSHOT
| +--- my.shared:yellow:+ -> 2.0-SNAPSHOT
| \--- my.shared:blue:+ -> 2.0-SNAPSHOT
现在,如果我将blue
and添加yellow
到我的多模块项目中,但不是green
,我得到:
compile - Compile classpath for source set 'main'.
+--- com.iii.shared:green:+ -> 2.0-SNAPSHOT
| +--- com.iii.shared:yellow:+ -> 2.0-SNAPSHOT
| \--- com.iii.shared:blue:+ -> project :blue
\--- project :blue
请注意,blue
即使它是可传递的,也可以正确解析到项目,但yellow
不是。
我个人认为这是一个特性,而不是一个错误——它反映了分发时实际发生的情况。我可以进行所有yellow
我想要的更改,但是如果我没有yellow
在我的存储库中放置一个新的工件并且也没有green
使用更新的依赖项进行更新,那么实际发布的版本将cyan
不会获得这些更改。