【问题标题】:gradle constraints for transitive dependencies only仅用于传递依赖的 gradle 约束
【发布时间】:2021-12-10 05:43:09
【问题描述】:

我想确保任何传递依赖项(即我的依赖项的依赖项)都使用正确的版本,而不需要引入依赖项本身。

例如,我的项目依赖于依赖于 C 的 B(和其他依赖项)。我希望 C 始终是 v2。

我试过这段代码

constraints {
    implementation('C') {
        version {
            require '2'
        }
        because 'I cant use previous versions'
    }
}

我特别使用 约束,因为这似乎是 gradle 推荐的处理传递属性的方式。

但是,我的依赖报告看起来像:

运行时类路径

+--- B
|    \--- C:2
+--- C:2

而没有上面的代码,它只是

+--- B
     \--- C:1.X

意味着 C 库的 v2 也直接添加到了我的 runtimeClasspath 中。

是否有任何 gradle 代码仅确保我的传递依赖项设置为特定版本,而不是将库版本添加为直接依赖项?

谢谢

【问题讨论】:

    标签: gradle dependencies constraints transitive-dependency


    【解决方案1】:

    Gradle 依赖约束完全符合您的要求。

    即使在gradlew dependencies 的输出中列出了依赖项,它也没有严格包含在构建中。 请注意依赖C 是如何用(c) 标记的,这清楚地表明它只是一个约束而不是严格要求:

    +--- B
    |    \--- C:1.X -> 2
    \--- C:2 -> 2 (c)
    
    (c) - dependency constraint
    

    事实上,它之所以被列出,只是因为至少有一个其他依赖项需要它:如果您对依赖项 D 定义了一个任何依赖项都不需要传递的约束,那么它永远不会显示出来。

    摘自 Gradle 官方文档:

    commons-codec:1.11 的版本定义仅在将 commons-codec 作为传递依赖项引入时才考虑在内,因为 commons-codec 在项目中未定义为依赖项。 否则约束无效。

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 2021-09-05
      • 1970-01-01
      相关资源
      最近更新 更多