2024-11-15
一言
欲买桂花同载酒,荒泷天下第一斗。 --- 《原神》 · 鱼鱼
Gradle version catalog
这段内容解释了 Gradle Version Catalog 中如何定义依赖的版本,特别是版本可以使用 普通版本声明 和 富版本声明(Rich Version Declaration)。
1. 普通版本声明(Required Version)
- 使用简单的字符串来声明版本,这种方式等同于“强制要求使用这个版本”。
- 示例:
[versions]
other-lib = "5.5.0"
- 解释:
other-lib
依赖必须使用版本5.5.0
。- 这种方式简单直接,但缺乏灵活性。
2. 富版本声明(Rich Version Declaration)
- 富版本声明允许通过多种规则来定义依赖的版本,提供更高的灵活性。
- 示例:
[versions]
my-lib = { strictly = "[1.0, 2.0[", prefer = "1.2" }
- 解释:
strictly = "[1.0, 2.0["
:严格约束版本必须在[1.0, 2.0[
范围内(包括1.0
,不包括2.0
)。prefer = "1.2"
:如果可能,优先使用1.2
版本。- 如果
strictly
和prefer
都生效,Gradle 会优先选择1.2
(因为它满足范围约束)。
3. 支持的属性说明
1. require: 必须使用的版本
- 等价于普通版本声明。
- 如果设置了
require
,其他版本规则将被忽略。
[versions]
lib = { require = "3.5.0" }
2. strictly: 严格约束的版本范围
- 约束依赖的版本必须符合指定范围,如果发现不符合约束的版本,Gradle 会失败。
- 常见的版本范围语法:
[1.0, 2.0]
:闭区间,版本在 1.0 和 2.0 之间,包括边界。[1.0, 2.0[
:混合区间,版本在 1.0 和 2.0 之间,包括 1.0,但不包括 2.0。(1.0, 2.0)
:开区间,版本在 1.0 和 2.0 之间,不包括边界。
[versions]
lib = { strictly = "[1.0, 2.0]" }
3. prefer: 首选版本
- 表示在所有可能满足约束的版本中,优先选择指定版本。
- 如果没有设置
strictly
,prefer
的版本会被直接使用。
[versions]
lib = { prefer = "1.2.3" }
4. reject: 拒绝的版本列表
- 表示明确排除某些版本,即使这些版本符合其他约束。
[versions]
lib = { reject = ["1.0", "1.1"] }
- 解释:
- 排除了
1.0
和1.1
,Gradle 不会选择这些版本。
- 排除了
5. rejectAll: 全部拒绝(布尔值)
- 如果
rejectAll = true
,所有版本都会被拒绝(一般用来临时禁用依赖)。
[versions]
lib = { rejectAll = true }
4. 使用场景和规则解析优先级
(1)require
- 如果指定了
require
,其他规则如strictly
和prefer
将被忽略,直接强制使用指定版本。
(2)strictly + prefer
strictly
约束范围,而prefer
决定在符合范围的版本中优先选择哪个版本。
[versions]
lib = { strictly = "[1.0, 2.0]", prefer = "1.5" }
- 如果可用版本有
1.2
,1.5
,1.8
:- 版本范围
[1.0, 2.0]
生效,1.2
,1.5
,1.8
都符合范围。 - Gradle 优先选择
1.5
,因为它是首选版本。
- 版本范围
(3)strictly + reject
strictly
和reject
可以组合使用,用于排除不符合范围或特定需求的版本。
[versions]
lib = { strictly = "[1.0, 2.0]", reject = ["1.3"] }
- 如果 可用版本有
1.2
,1.3
,1.5
:- 版本范围
[1.0, 2.0]
生效,1.2
,1.3
,1.5
都符合范围。 - 版本
1.3
被排除,最终 Gradle 选择1.2
或1.5
。
- 版本范围
(4)rejectAll
- 当
rejectAll = true
时,所有版本都会被拒绝,依赖无法解析。 - 一般用于调试或临时禁用依赖。
5. 示例总结
以下是一个完整的示例,结合所有 Rich Versions 属性:
[versions]
lib = { strictly = "[1.0, 2.0[", prefer = "1.5", reject = ["1.3", "1.4"] }
- strictly: 版本范围
[1.0, 2.0[
,即1.0
到2.0
(不包括2.0
)。 - prefer: 首选版本是
1.5
。 - reject: 明确排除了版本
1.3
和1.4
。
总结
Gradle Rich Versions 提供了灵活的依赖版本管理方式:
- require 用于强制固定版本。
- strictly 用于限制版本范围。
- prefer 用于指定首选版本。
- reject 和 rejectAll 用于排除特定版本。
通过这些机制,你可以更好地控制依赖版本的选择和冲突解决,确保项目构建的稳定性和兼容性。
在项目的 build.gradle.kts
中强制使用 1.6
:
dependencies {
implementation(libs.lib) {
version {
strictly("1.6")
}
}
}