Gradle支持用于声明版本的丰富模型,该模型允许组合不同级别的版本信息. 术语及其含义如下(从最强到最弱):

strictly

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

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

require

表示所选版本不能低于require接受的版本,但通过冲突解决可以更高,即使更高版本具有排他性更高的界限. 这就是依赖项上的直接版本所转换的内容. 该术语支持动态版本.

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

prefer

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

定义可以strictly补充或require .

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

reject

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

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

表1.丰富版本的用例
可以使用哪个版本的依存关系? strictly require prefer rejects 选择结果

经过1.5版测试,相信所有将来的版本都可以使用.

1.5

1.5开始的任何版本,等效于org:foo:1.5 . 接受升级到2.4 .

经过1.5测试,软约束根据语义版本升级.

[1.0, 2.0[

1.5

1.02.0之间的任何版本,如果没有其他人关心,则为1.5 . 接受升级到2.4 .

经过1.5测试,但遵循语义版本控制.

[1.0, 2.0[

1.5

介于1.02.0之间的任何版本,如果没有其他人不在乎,则为1.5 .
从传递依赖项覆盖版本.

与上述相同,已知1.4损坏.

[1.0, 2.0[

1.5

1.4

如果没有其他人在乎,则排除1.41.5之间的任何版本,介于1.02.0之间.
从传递依赖项覆盖版本.

没意见,适用于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约束不同意则失败.
从传递依赖项覆盖版本.

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

strictly使用(尤其是对图书馆而言)必须是一个经过深思熟虑的过程,因为它会对下游用户产生影响. 同时,如果使用得当,它将有助于消费者了解哪些库组合在其上下文中无法协同工作. 有关更多信息,请参见覆盖依赖项版本 .

丰富的版本信息将以Gradle Module元数据格式保存. 但是,转换为Ivy或Maven元数据格式将是有损的. 最高级别的发表会,这是strictlyrequireprefer . 此外,任何reject都会被忽略.

通过version DSL方法在依赖项或约束声明中访问富版本声明,该声明提供对MutableVersionConstraint的访问.

例子1.丰富的版本声明
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'
            }
        }
    }
}
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")
            }
        }
    }
}