gradle 中的版本范围

Version ranges in gradle

在 gradle 依赖项中指定版本范围的可能方法有哪些?我看到了一些 1.+ 符号,但我还没有找到真正说明什么是可能的,什么不是的文档。另外不知道maven ranges能不能用

谁能给我一个简短的概述,以便我理解规则?

本书 "Gradle Dependency Management" 第 1 页指出。 12 和 13,除了 +-notation(2.1.+ 表示从 2.1.0 到 2.2.0 不包括的范围)之外,您还可以使用 Ivy 表示法表示

形式的开区间和闭区间
[1.0,2.0]
[1.0,2.0[

[1.0, )

对于 "all versions starting from 1.0"。

首选方案

使用 Ivy 表示法指定版本范围。以下是从 this web page:

复制的一些示例
  • [1.0, 2.0]:所有版本 >= 1.0 和 <= 2.0
  • [1.0, 2.0[:所有版本 >= 1.0 和 < 2.0
  • [1.0, ) : 所有版本 >= 1.0 // avoid. Unbound is dangerous!

麻烦的选择

在主要、次要或补丁号中使用“+”。这种方法至少有两个问题:

  • 如果您正在构建一个库并生成一个 pom 文件,则该 pom 将与 Maven 不兼容,除非您应用一些解决方法来解析版本并防止 pom 依赖项在版本元素中使用“+”。参见 this Gradle github issue
  • '+'的含义容易混淆。好吧,也许不是,但是问问周围的人,看看你的同龄人是否都知道 1.1.+1.1+ 在 gradle 依赖关系中的确切区别。

理想选择

完全避免 动态 依赖项(使用“+”或版本范围)。相反,使用固定的版本依赖项并经常通过良好的测试更新版本。原因如下:

  • 在过去,向后兼容性是神圣不可侵犯的。这不再是事实了。 新版本通常 move/remove/rename 类 和功能。
  • 如果您的依赖项是动态的(尤其是“+”或未绑定范围),下一个构建可能会选择与您的项目不兼容的新版本。不兼容性只能在运行时检测到。
  • 今天构建的库的版本 X 可能与明天构建的库的版本 X 不同,如果它的依赖项是动态的并且新版本在一夜之间发布。这种程度的不确定性对于图书馆来说是不可取的。