Dependencies Gradle多项目可选子项目&x27;的可传递依赖项应解析为现有子项目

Dependencies Gradle多项目可选子项目&x27;的可传递依赖项应解析为现有子项目,dependencies,gradle,multi-project,build-system,transitive-dependency,Dependencies,Gradle,Multi Project,Build System,Transitive Dependency,假设以下项目。主项目是一个多项目,但较大项目的每个部分都可以单独开发或混合开发: /master/build.gradle /m1/build.gradle /m2/build.gradle /m3/build.gradle 假设m3使用m2和m2使用m1(m1处理Gradle构建的动态子集是一项计划中的功能。同时,我提出的最佳解决方案是引入一种新的依赖关系表示法,它可以动态映射到项目依赖关系或外部依赖关系。您可以在这里找到概念证明: PS:在开始自行实现此功能之前,请重新考虑此时是否真的需要

假设以下项目。主项目是一个多项目,但较大项目的每个部分都可以单独开发或混合开发:

/master/build.gradle
/m1/build.gradle
/m2/build.gradle
/m3/build.gradle

假设
m3
使用
m2
m2
使用
m1
m1处理Gradle构建的动态子集是一项计划中的功能。同时,我提出的最佳解决方案是引入一种新的依赖关系表示法,它可以动态映射到项目依赖关系或外部依赖关系。您可以在这里找到概念证明:

PS:在开始自行实现此功能之前,请重新考虑此时是否真的需要它。等到它得到官方支持时,您可能会省去一些麻烦。

首先,在(也来自)的帮助下,我想出了下面的窍门

在顶级build.gradle()中:

//确保我们已经分析了子项目依赖项
evaluationDependsOnChildren()
def subprojectsByName=subprojects.collectEntries{it->[it.name,it]}
子项目.each{p->
def hacks=[]//我们将要进行的更改列表
p、 配置.each{c->
c、 dependencies.each{d->
if(d.group.startsWith(“my.group.prefix”)){
def sub=subprojectsByName[d.name]
如果(sub!=null){
黑客添加({
//无法立即执行此操作,否则将出现ConcurrentModificationException
c、 依赖项。删除(d)
p、 依赖项。添加(c.name,sub)
})
}
}
}
}
//现在我们可以安全地应用更改
用于(黑客入侵){
黑客()
}
}
这样做的好处是,与其他项目不同,您不必修改子项目

这仍然存在一个问题,即一旦遇到二进制依赖项,任何纯可传递的依赖项都将被解析为二进制。例如,假设我有一个项目
cyan
,它直接依赖于
绿色
蓝色
,并通过
绿色
,在
黄色
上传递:

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
现在,如果我将
蓝色
黄色
添加到我的多模块项目中,而不是
绿色
,我会得到:

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
不是


我个人认为这是一个特性,而不是一个bug——它反映了发行时实际发生的情况。我可以对
yellow
进行我想要的所有更改,但是如果我不在我的存储库中放入一个新的
yellow
工件,以及一个更新的
green
和更新的依赖项,那么实际发布的
cyan
不会得到这些更改。

我们已经实现了它…我们正在探索从二进制工件中获得sub2的可能性,在这种情况下,sub3的可传递性被解析为二进制…这是不可取的。OK,你没有提到。我不确定当前Gradle是否可以实现,以及如何实现。恐怕你不得不这样做深入挖掘自己。
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