最简单的版本声明是一个表示要使用的版本的简单字符串。 Gradle 支持声明版本字符串的不同方式:
-
精确版本:例如
1.3
,1.3.0-beta3
,1.0-20150201.131010-1
-
Maven 风格的版本范围:例如
[1.0,)
,[1.1, 2.0)
,(1.2, 1.5]
-
和
[
符号]
表示包含边界;(
并)
指示排它边界。 -
当上限或下限缺失时,范围没有上限或下限。
-
该符号
]
可以用来代替(
排它下界,也[
可以代替)
排它上限。例如]1.0, 2.0[
-
上限排除充当前缀排除。这意味着
[1.0, 2.0[
还将排除所有以2.0
小于2.0
.例如,类似2.0-dev1
或 的版本2.0-SNAPSHOT
不再包含在该范围内。
-
-
前缀版本范围:例如
1.`, `1.3.
-
+
仅包含与之前部分完全匹配的版本。 -
该范围
+
本身将包括任何版本。
-
-
一个
latest-status
版本:例如latest.integration
,latest.release
-
将匹配具有指定状态的最高版本模块。请参阅ComponentMetadata.getStatus()。
-
-
Maven
SNAPSHOT
版本标识符:例如1.0-SNAPSHOT
,1.4.9-beta1-SNAPSHOT
版本订购
版本具有隐式排序。版本排序用于:
-
确定特定版本是否包含在范围内。
-
执行冲突解决时确定哪个版本是“最新”(但请注意,冲突解决使用 “基本版本”)。
版本根据以下规则排序:
-
每个版本都分为其组成“部分”:
-
这些字符
[. - _ +]
用于分隔版本的不同“部分”。 -
任何包含数字和字母的部分都会被分成单独的部分:
1a1 == 1.a.1
-
仅比较版本的部分内容。实际的分隔符并不重要:(
1.a.1 == 1-a+1 == 1.a-1 == 1a1
但请注意,在冲突解决的上下文中,此规则有例外)。
-
-
使用以下规则比较 2 个版本的等效部分:
-
如果两个部分都是数字,则最高的数值较高:
1.1
<1.2
-
如果其中一部分是数字,则认为它高于非数字部分:
1.a
<1.1
-
如果两者都是非数字,则按字母顺序比较各部分,并区分大小写:
1.A
<1.B
<1.a
<1.b
-
具有额外数字部分的版本被认为比不具有额外数字部分的版本更高(即使它为零):
1.1
<1.1.0
-
具有额外非数字部分的版本被认为低于没有以下内容的版本:
1.1.a
<1.1
-
-
某些非数字部分对于订购而言具有特殊含义:
-
dev
被认为低于任何其他非数字部分:1.0-dev
<1.0-ALPHA
<1.0-alpha
<1.0-rc
。 -
字符串
rc
,snapshot
,final
,ga
,release
和sp
被认为高于任何其他字符串部分(按此顺序排序):1.0-zeta
<1.0-rc
<1.0-snapshot
<1.0-final
<1.0-ga
< <1.0-release
<1.0-sp
<1.0
。 -
与常规字符串部分相反,这些特殊值不区分大小写
1.0-RC-1
,并且它们不依赖于它们周围使用的分隔符: ==1.0.rc.1
-
简单版本声明语义
当您使用简写符号声明版本时,例如:
dependencies {
implementation("org.slf4j:slf4j-api:1.7.15")
}
dependencies {
implementation('org.slf4j:slf4j-api:1.7.15')
}
然后该版本被认为是必需版本,这意味着它至少应该是1.7.15
但可以由引擎升级(乐观升级)。
然而,严格版本有一个简写符号,使用以下!!
符号:
dependencies {
// short-hand notation with !!
implementation("org.slf4j:slf4j-api:1.7.15!!")
// is equivalent to
implementation("org.slf4j:slf4j-api") {
version {
strictly("1.7.15")
}
}
// or...
implementation("org.slf4j:slf4j-api:[1.7, 1.8[!!1.7.25")
// is equivalent to
implementation("org.slf4j:slf4j-api") {
version {
strictly("[1.7, 1.8[")
prefer("1.7.25")
}
}
}
dependencies {
// short-hand notation with !!
implementation('org.slf4j:slf4j-api:1.7.15!!')
// is equivalent to
implementation("org.slf4j:slf4j-api") {
version {
strictly '1.7.15'
}
}
// or...
implementation('org.slf4j:slf4j-api:[1.7, 1.8[!!1.7.25')
// is equivalent to
implementation('org.slf4j:slf4j-api') {
version {
strictly '[1.7, 1.8['
prefer '1.7.25'
}
}
}
严格版本无法升级,并且会覆盖源自此依赖项提供的任何传递依赖项。建议对严格版本使用范围。
上面的符号[1.7, 1.8[!!1.7.25
相当于:
-
严格地
[1.7, 1.8[
-
更喜欢
1.7.25
这意味着引擎必须选择 1.7(包含)和 1.8(排除)之间的版本,并且如果图中没有其他组件需要不同的版本,则它应该更喜欢 1.7.25
.
声明没有版本的依赖项
对于较大的项目,推荐的做法是声明不带版本的依赖项,并使用依赖项约束进行版本声明。优点是依赖项约束允许您在一个地方管理所有依赖项的版本,包括传递依赖项。
dependencies {
implementation("org.springframework:spring-web")
}
dependencies {
constraints {
implementation("org.springframework:spring-web:5.0.2.RELEASE")
}
}
dependencies {
implementation 'org.springframework:spring-web'
}
dependencies {
constraints {
implementation 'org.springframework:spring-web:5.0.2.RELEASE'
}
}