使用 extendsFrom 共享配置依赖关系并控制顺序

Posted

技术标签:

【中文标题】使用 extendsFrom 共享配置依赖关系并控制顺序【英文标题】:Share configuration dependencies using extendsFrom with control over order 【发布时间】:2021-12-23 03:43:45 【问题描述】:

今天早上在我的 gradle build 中收到了这个警告,并试图弄清楚如何解决它

Adding a Configuration as a dependency is a confusing behavior
which isn't recommended. This behaviour has been deprecated 
and is scheduled to be removed in Gradle 8.0. If you're 
interested in inheriting the dependencies from the 
Configuration you are adding, you should use extendsFrom

跟进this answer...我将配置用作依赖方法,因此我可以控制排序。

例如:

configurations 
  A
  B 
    extendsFrom A
  

dependencies 
  A 'jar1'
  B 'jar2'

似乎导致B的路径顺序为jar1;jar2

但是如果我想让 B和 A 一样,但是覆盖 A 中的一些类,那么我首先需要 B 的依赖项。

所以我使用了这种方法:

configurations 
  A
  B

dependencies 
  A 'jar1'
  B 'jar2'
  B A

这导致 B 的路径是 jar2;jar1

我想不出使用extendsFrom 让它工作的方法。 主要是我尝试在dependencies 部分中使用具有各种语法的B.extendsFrom(A),但无法编译。

有没有办法让覆盖/排序用例使用extendsFrom 工作?

【问题讨论】:

【参考方案1】:

我相信extendsFrom 是不可能的。

我不是依赖项领域的专家,但对你有用或能给你一些想法的方法是:

def a = project.configurations.findByName("A")
def b = project.configurations.findByName("A")
b.getIncoming().beforeResolve 
    // If you want to get also dependencies from 
    // configurations that "A" extends use getAlLDependencies
    a.getDependencies().forEach
        b.dependencies.add(it)
    

注意:getDependencies() 和 getAllDependencies() 不会返回已解析的依赖项,而只会返回在构建脚本中添加到配置中的依赖项(例如,“jar1”)。如果你想解析依赖项,你必须解析 A。

注意 2:我不推荐类阴影,因为我认为你想要实现。它会带来很多意想不到的麻烦,例如应用程序可以编译但可能无法在运行时运行。也许您应该进行依赖替换或解决与功能的冲突 (https://docs.gradle.org/7.2/userguide/dependency_capability_conflict.html#sub:declaring-component-capabilities)。

【讨论】:

这似乎是一种将依赖项从一个配置复制到另一个配置的有用方法。 Gradle 警告消息似乎表明所有形式的都不是一个好主意,应该使用 extendsFrom。如果您可以在依赖部分中使用 extendsFrom 来控制排序,那就太好了。我正在覆盖 3rd 方库中的一个类 - 这不是我们喜欢做的,但偶尔是必要的。

以上是关于使用 extendsFrom 共享配置依赖关系并控制顺序的主要内容,如果未能解决你的问题,请参考以下文章

sbt共享项目之间的依赖关系

使用 ctypes/cffi 解决循环共享对象依赖关系

确定 Linux 二进制文件的直接共享对象依赖关系?

Node.js 和前端之间共享的模块中的模块语法和依赖关系

ctypes 加载具有依赖关系的 c 共享库

C++ 加载一个具有依赖关系的共享对象并访问它们的功能