跳到主要内容

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 版本。
    • 如果 strictlyprefer 都生效,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: 首选版本

  • 表示在所有可能满足约束的版本中,优先选择指定版本。
  • 如果没有设置 strictlyprefer 的版本会被直接使用。
[versions]
lib = { prefer = "1.2.3" }

4. reject: 拒绝的版本列表

  • 表示明确排除某些版本,即使这些版本符合其他约束。
[versions]
lib = { reject = ["1.0", "1.1"] }
  • 解释
    • 排除了 1.01.1,Gradle 不会选择这些版本。

5. rejectAll: 全部拒绝(布尔值)

  • 如果 rejectAll = true,所有版本都会被拒绝(一般用来临时禁用依赖)。
[versions]
lib = { rejectAll = true }

4. 使用场景和规则解析优先级

(1)require

  • 如果指定了 require,其他规则如 strictlyprefer 将被忽略,直接强制使用指定版本。

(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

  • strictlyreject 可以组合使用,用于排除不符合范围或特定需求的版本。
[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.21.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.02.0(不包括 2.0)。
  • prefer: 首选版本是 1.5
  • reject: 明确排除了版本 1.31.4

总结

Gradle Rich Versions 提供了灵活的依赖版本管理方式:

  • require 用于强制固定版本。
  • strictly 用于限制版本范围。
  • prefer 用于指定首选版本。
  • rejectrejectAll 用于排除特定版本。

通过这些机制,你可以更好地控制依赖版本的选择和冲突解决,确保项目构建的稳定性和兼容性。

在项目的 build.gradle.kts 中强制使用 1.6

dependencies {
implementation(libs.lib) {
version {
strictly("1.6")
}
}
}