Gradle 支援豐富的模型來宣告版本,這允許結合不同層級的版本資訊。以下說明這些術語及其意義,從最強到最弱

strictly

任何與此版本表示法不匹配的版本都將被排除。這是最強的版本宣告。在已宣告的相依性上,strictly 可以降級版本。在傳遞相依性上,如果無法選取此子句可接受的版本,它將導致相依性解析失敗。請參閱 覆寫相依性版本 以取得詳細資訊。此術語支援動態版本。

定義時,這將覆寫任何先前的 require 宣告,並清除先前的 reject

require

表示選取的版本不能低於 require 接受的版本,但可以透過衝突解決而更高,即使較高版本具有獨佔的上限。這是直接相依性轉換的結果。此術語支援動態版本。

定義時,這將覆寫任何先前的 strictly 宣告,並清除先前的 reject

prefer

這是一個非常軟的版本宣告。它僅在沒有針對模組版本更強的非動態意見時才適用。此術語不支援動態版本。

定義可以補充 strictlyrequire

定義時,這會覆寫任何先前的 prefer 宣告,並清除先前的 reject

層級結構之外還有一個額外的術語

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.02.0 之間的任何版本(不含),但 1.4 除外,如果沒有其他人關心,則為 1.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'
            }
        }
    }
}