1

假设以下项目。主项目是多项目,然而,更大的项目的每个部分可单独开发或在混合:应将Gradle多项目可选子项目的传递相关性解析为现有的子项目

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

假设m3使用m2m2使用m1m1 <- m2 <- m3)

m2存在是可选多项目以下布局也合理

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

但在这种情况下m2会从工件存储库中拉出来,这很好...但是m1m2的传递依赖关系,这很好,但是如何告诉gradle使用本地版本的m1而不是烘焙的工件?

我一直坚持这个,每个地方我有权访问这些东西gradle给我“只”ModuleVersionSelector级别的访问,我怎么能根据下载的工件传递依赖关系添加一个DefaultProjectDependency

我可以有一个替代方案,如果我可以访问存档的工件的完全依赖关系图,并放入一些覆盖/排除。

编辑:

我想出了利用使用resolutionStrategy过滤器是最好的,我已经通过进一步发展“弹性DEPS”项目创建了一个例子

https://github.com/kgyrtkirk/elastic-deps

回答

1

使用Gradle构建的动态子集是一项计划的功能。同时,我提出的最佳解决方案是引入一个新的依赖表示法,该表示法被动态映射到项目依赖项或外部依赖项。你可以找到一个证明概念的位置:https://github.com/pniederw/elastic-deps

PS:在开始实施对自己的这项功能前,再考虑是否真正需要它在这一点上。您可以通过等待直到它获得正式支持来节省一些头痛。

+0

我们已经实现了它...我们正在探索从二元伪影中获得sub2的可能性,在这种情况下,sub3的传递性被解析为二进制......这是不需要的 –

+0

好吧,你没有提到这一点。我不确定当前的Gradle能否实现这一目标。恐怕你必须深入挖掘自己。 –

2

elastic-deps开始,并在this answer(也从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直接取决于​​和blue和传递性,通过​​,在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 

现在,如果我添加blueyellow到我的多模块项目,但不​​,我得到:

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工件放入我的存储库中,并且更新后的​​具有更新的依赖关系,那么实际版本cyan不会获得这些更改。

相关问题