相依性限制的功能與 相依性 類似,主要區別在於它們本身不引入相依性。相反地,限制定義了版本需求,當透過其他方式將相依性引入專案時,這些需求會影響解析過程。
雖然預設情況下限制不是嚴格版本,但如果需要,您可以指定嚴格版本限制。一旦包含相依性,限制指定的版本就會參與衝突解決,就像它是宣告為直接相依性一樣。
在開發單一專案程式庫時,限制可以直接與直接相依性一起宣告。但是,在開發多專案程式庫和應用程式時,最好在 平台 中集中宣告相依性
plugins {
`java-platform`
}
dependencies {
constraints {
// Platform declares some versions of libraries used in subprojects
api("commons-httpclient:commons-httpclient:3.1")
api("org.apache.commons:commons-lang3:3.8.1")
}
}
plugins {
id 'java-platform'
}
dependencies {
constraints {
// Platform declares some versions of libraries used in subprojects
api 'commons-httpclient:commons-httpclient:3.1'
api 'org.apache.commons:commons-lang3:3.8.1'
}
}
一般而言,相依性分為直接或可轉移
-
直接相依性是指在組件的建置或中繼資料中明確指定的相依性。
-
可轉移相依性不是直接指定的;它們會作為直接相依性的相依性自動拉入。
組件可能需要直接和可轉移相依性才能編譯或執行。
宣告與直接相依性並行的限制
相依性限制允許您為特定相依性定義版本或版本範圍,無論何時在解析期間遇到該相依性。
這是跨多個配置或專案管理組件版本的首選方法。
當 Gradle 解析模組版本時,它會考慮所有相關因素,包括 豐富版本、可轉移相依性和該模組的相依性限制。選擇符合所有條件的最高版本。如果不存在此版本,Gradle 將會失敗並顯示錯誤,詳細說明衝突的宣告。
在這種情況下,您可以調整您的相依性宣告、相依性限制,或對可轉移相依性進行必要的變更。
與相依性宣告一樣,相依性限制也按配置劃分範圍,允許您選擇性地將它們應用於建置的特定部分。
constraints{}
區塊用於 dependencies{}
區塊中,以宣告這些限制
plugins {
`java-platform`
}
dependencies {
constraints {
api("commons-httpclient:commons-httpclient:3.1")
runtime("org.postgresql:postgresql:42.2.5")
}
}
plugins {
id 'java-platform'
}
dependencies {
constraints {
api 'commons-httpclient:commons-httpclient:3.1'
runtime 'org.postgresql:postgresql:42.2.5'
}
}
-
api("commons-httpclient:commons-httpclient:3.1")
:-
此行在
api
配置上建立限制,聲明如果commons-httpclient
曾經由擴展api
配置的可解析配置解析,則其版本必須為3.1
或更高。 -
如果可轉移相依性(相依性的相依性)或專案中的另一個模組拉入不同版本的
commons-httpclient
,Gradle 會強制執行相依性以解析為至少版本3.1
。 -
此限制確保程式庫
commons-httpclient
在所有擴展api
配置的配置中,版本至少為3.1
。
-
-
runtime("org.postgresql:postgresql:42.2.5")
:-
同樣地,此行在
runtime
配置上套用限制,強制org.postgresql:postgresql
必須解析為至少版本42.2.5
。 -
即使專案中的其他相依性或模組嘗試引入不同版本的
postgresql
,Gradle 也會選擇42.2.5
和其他宣告版本中較高的版本。 -
這確保了
postgresql
上的任何執行階段相依性都將解析為至少版本42.2.5
,跨越所有擴展runtime
配置的可解析配置。
-
新增對可轉移相依性的限制
相依性管理問題通常源自可轉移相依性。開發人員有時會錯誤地透過新增直接相依性來解決這些問題,而不是使用限制來正確處理它們。
相依性限制允許您控制可轉移相依性的選擇。
在以下範例中,commons-codec:1.11
的版本限制僅在 commons-codec
作為可轉移相依性引入時才適用,因為它未在專案中直接宣告為相依性。如果 commons-codec
不是以可轉移方式拉入,則限制無效
dependencies {
implementation("org.apache.httpcomponents:httpclient")
constraints {
implementation("org.apache.httpcomponents:httpclient:4.5.3") {
because("previous versions have a bug impacting this application")
}
implementation("commons-codec:commons-codec:1.11") {
because("version 1.9 pulled from httpclient has bugs affecting this application")
}
}
}
dependencies {
implementation 'org.apache.httpcomponents:httpclient'
constraints {
implementation('org.apache.httpcomponents:httpclient:4.5.3') {
because 'previous versions have a bug impacting this application'
}
implementation('commons-codec:commons-codec:1.11') {
because 'version 1.9 pulled from httpclient has bugs affecting this application'
}
}
}
相依性限制僅在使用 Gradle 模組中繼資料 時發佈。這表示只有在同時使用 Gradle 發佈和取用模組時,才能完全支援它們。如果模組是使用 Maven 或 Ivy 取用,則限制可能不會保留。 |
相依性限制是可轉移的。如果 程式庫 A
依賴於 程式庫 B
,且 程式庫 B
在 模組 C
上宣告了限制,則該限制將影響 程式庫 A
依賴的 模組 C
版本。
例如,如果 程式庫 A
依賴於 模組 C 版本 2
,但 程式庫 B
在 模組 C 版本 3
上宣告了限制,則 程式庫 A
將解析 模組 C 的版本 3
。