Gradle 支持丰富的版本声明模型,允许组合不同级别的版本信息。这些术语及其含义按从最强到最弱的顺序解释如下:

strictly

任何与此版本符号不匹配的版本都将被排除。这是最强版本宣言。对于已声明的依赖项,strictly可以降级版本。当存在传递依赖时,如果无法选择此子句可接受的版本,则会导致依赖解析失败。有关详细信息,请参阅覆盖依赖项版本。该术语支持动态版本。

定义后,它将覆盖任何先前的require声明并清除先前的reject

require

意味着所选版本不能低于require接受的版本,但可以通过冲突解决方案更高,即使更高版本具有独占的上限。这就是直接依赖的含义。该术语支持动态版本。

定义后,它将覆盖任何先前的strictly声明并清除先前的reject

prefer

这是一个非常软的版本声明。仅当对该模块的版本没有更强的非动态意见时才适用。该术语不支持动态版本。

定义可以补足strictlyor require

定义后,它将覆盖任何先前的prefer声明并清除先前的reject

在级别层次结构之外还有一个附加术语:

reject

声明该模块不接受特定版本。如果唯一可选的版本也被拒绝,这将导致依赖性解析失败。该术语支持动态版本。

下表说明了许多用例以及如何组合不同术语以进行丰富版本声明:

表 1. 丰富版本用例
该依赖项的哪些版本是可以接受的? strictly require prefer rejects 评选结果

使用 version 进行测试1.5,相信所有未来版本都应该可以工作。

1.5

从 开始的任何版本1.5,相当于org:foo:1.5.2.4接受升级。

经测试1.5,软约束根据语义版本控制进行升级。

[1.0, 2.0[

1.5

1.0和之间的任何版本2.01.5如果没有其他人关心的话。2.4接受升级。
????

使用 进行测试1.5,但遵循语义版本控制。

[1.0, 2.0[

1.5

1.0介于和之间的任何版本2.0(独占),1.5如果没有其他人关心的话。
覆盖传递依赖项的版本。
????

与上面相同,1.4已知已损坏。

[1.0, 2.0[

1.5

1.4

1.0和之间的任何版本2.0(排除),除了1.41.5如果没有其他人关心的话。
覆盖传递依赖项的版本。
????

没有意见,与 一起工作1.5

1.5

1.5如果没有其他意见,则有其他意见。

没有意见,更喜欢最新版本。

latest.release

构建时的最新版本。
????

在边缘,最新版本,没有降级。

latest.release

构建时的最新版本。
????

除了 1.5 之外没有其他版本。

1.5

1.5,或者如果另一个strict或更高的require约束不同意则失败。
覆盖传递依赖项的版本。

1.5或其专门的补丁版本。

[1.5,1.6[

最新1.5.x补丁版本,或者如果另一个strict或更高的require约束不同意则失败。
覆盖传递依赖项的版本。
????

用锁 (??????) 注​​释的行表示在这种情况下利用依赖锁定是有意义的。与丰富版本声明相关的另一个概念是发布已解析版本而不是已声明版本的能力。

使用strictly,尤其是对于图书馆来说,必须是一个深思熟虑的过程,因为它会对下游消费者产生影响。同时,如果使用得当,它将帮助消费者了解哪些库组合在他们的环境中不能协同工作。有关详细信息,请参阅覆盖依赖项版本。

丰富的版本信息将以 Gradle 模块元数据格式保存。然而,转换为 Ivy 或 Maven 元数据格式将会有损。将发布最高级别,即strictlyrequire以上prefer。此外,任何内容reject都将被忽略。

丰富版本声明是通过version依赖项或约束声明上的 DSL 方法访问的,该声明允许访问MutableVersionConstraint

build.gradle.kts
dependencies {
    implementation("org.slf4j:slf4j-api") {
        version {
            strictly("[1.7, 1.8[")
            prefer("1.7.25")
        }
    }

    constraints {
        add("implementation", "org.springframework:spring-core") {
            version {
                require("4.2.9.RELEASE")
                reject("4.3.16.RELEASE")
            }
        }
    }
}
build.gradle
dependencies {
    implementation('org.slf4j:slf4j-api') {
        version {
            strictly '[1.7, 1.8['
            prefer '1.7.25'
        }
    }

    constraints {
        implementation('org.springframework:spring-core') {
            version {
                require '4.2.9.RELEASE'
                reject '4.3.16.RELEASE'
            }
        }
    }
}