Gradle 定義的標準屬性
Gradle 定義了一系列由 Gradle 的核心外掛程式使用的標準屬性。
與生態系統無關的標準屬性
屬性名稱 | 說明 | 值 | 相容性和消除歧義規則 |
---|---|---|---|
表示變異的主要目的 |
|
遵循生態系統語意(例如, |
|
表示此軟體元件的類別 |
|
遵循生態系統語意(例如, |
|
表示 |
|
遵循生態系統語意(例如,在 JVM 世界中, |
|
表示 |
|
沒有預設值,不相容 |
|
表示如何存取變異的相依性。 |
|
遵循生態系統語意(例如,在 JVM 世界中, |
|
表示產生此輸出的驗證任務類型。 |
|
沒有預設值,不相容 |
當變異上存在 這些變異僅包含執行驗證任務的結果,例如測試結果或程式碼覆蓋率報告。它們不可發布,且如果新增到已發布的元件中,將會產生錯誤。 |
屬性名稱 | 說明 | 值 | 相容性和消除歧義規則 |
---|---|---|---|
|
組件層級屬性,衍生 |
基於狀態配置,預設狀態配置基於原始存放庫。 |
基於正在使用的配置 |
JVM 生態系統特定屬性
除了上述定義的生態系統獨立屬性之外,JVM 生態系統還新增下列屬性
屬性名稱 | 說明 | 值 | 相容性和消除歧義規則 |
---|---|---|---|
指出 JVM 版本相容性。 |
整數,對於 Java 1.4 及之前版本,使用 |
預設值為 Gradle 使用的 JVM 版本,較低版本與較高版本相容,優先使用相容性最高的版本。 |
|
指出變異已針對特定 JVM 環境最佳化。 |
常見值為 |
如果有多個變異可用,屬性用於優先選擇其中一個變異,但一般而言,所有值都相容。預設值為 |
|
指出產生此輸出的TestSuite名稱。 |
值為套件名稱。 |
沒有預設值,不相容 |
|
指出產生此輸出的TestSuiteTarget名稱。 |
值為目標名稱。 |
沒有預設值,不相容 |
|
指出測試套件類型(單元測試、整合測試、效能測試等)。 |
|
沒有預設值,不相容 |
JVM 生態系統還包含許多相容性和消歧義規則,適用於不同的屬性。有興趣的讀者可以查看 org.gradle.api.internal.artifacts.JavaEcosystemSupport
的程式碼。
原生生態系統特定屬性
除了上述定義的生態系統獨立屬性之外,原生生態系統還新增下列屬性
屬性名稱 | 說明 | 值 | 相容性和消除歧義規則 |
---|---|---|---|
指出二進位檔是否已使用偵錯符號建置 |
布林值 |
不適用 |
|
指出二進位檔是否已使用最佳化旗標建置 |
布林值 |
不適用 |
|
指出二進位檔的目標架構 |
|
無 |
|
指示二進制檔案的目標作業系統 |
從 OperatingSystemFamily 中定義的常數建置的 |
無 |
Gradle 外掛生態系統特定屬性
對於 Gradle 外掛開發,自 Gradle 7.0 起支援下列屬性。Gradle 外掛變體可透過此屬性指定與 Gradle API 版本的相容性。
屬性名稱 | 說明 | 值 | 相容性和消除歧義規則 |
---|---|---|---|
指示 Gradle API 版本相容性。 |
有效的 Gradle 版本字串。 |
預設為目前執行的 Gradle,較低版本相容於較高版本,偏好最高相容版本。 |
在建置指令碼或外掛中建立屬性
屬性是 型別化的。屬性可透過 Attribute<T>.of
方法建立
// An attribute of type `String`
val myAttribute = Attribute.of("my.attribute.name", String::class.java)
// An attribute of type `Usage`
val myUsage = Attribute.of("my.usage.attribute", Usage::class.java)
// An attribute of type `String`
def myAttribute = Attribute.of("my.attribute.name", String)
// An attribute of type `Usage`
def myUsage = Attribute.of("my.usage.attribute", Usage)
屬性類型支援大多數 Java 基本類別;例如 String
和 Integer
;或任何延伸 org.gradle.api.Named
的類別。屬性必須在 dependencies
處理常式上找到的屬性架構中宣告
dependencies.attributesSchema {
// registers this attribute to the attributes schema
attribute(myAttribute)
attribute(myUsage)
}
dependencies.attributesSchema {
// registers this attribute to the attributes schema
attribute(myAttribute)
attribute(myUsage)
}
然後可以設定組態以設定屬性的值
configurations {
create("myConfiguration") {
attributes {
attribute(myAttribute, "my-value")
}
}
}
configurations {
myConfiguration {
attributes {
attribute(myAttribute, 'my-value')
}
}
}
對於類型延伸 Named
的屬性,屬性的值必須透過物件工廠建立
configurations {
"myConfiguration" {
attributes {
attribute(myUsage, project.objects.named(Usage::class.java, "my-value"))
}
}
}
configurations {
myConfiguration {
attributes {
attribute(myUsage, project.objects.named(Usage, 'my-value'))
}
}
}
屬性比對
屬性相容性規則
屬性讓引擎選擇相容變異。在某些情況下,生產者可能沒有完全符合消費者要求的變異,但有可用的變異。
例如,如果消費者要求函式庫的 API,而生產者沒有完全符合的變異,則執行時期變異可以被視為相容。這通常發生在發布到外部儲存庫的函式庫。在這種情況下,我們知道即使沒有完全符合(API),我們仍然可以針對執行時期變異進行編譯(它包含多於我們編譯所需,但仍然可以使用)。
Gradle 提供 屬性相容性規則,可以針對每個屬性定義。相容性規則的角色是說明哪些屬性值相容,根據消費者要求的內容。
屬性消除歧義規則
由於屬性的多個值可以相容,Gradle 需要在所有相容候選者之間選擇「最佳」候選者。這稱為「消除歧義」。
這是透過實作 屬性消除歧義規則 來完成。
屬性消歧義規則必須透過 屬性比對策略 進行註冊,您可以從 屬性架構 取得此策略,而屬性架構是 DependencyHandler 的成員。
變異屬性比對演算法
當一個元件有許多不同的變異,而且有許多不同的屬性時,尋找最佳變異可能會變得複雜。Gradle 的相依性解析引擎在尋找最佳結果(或失敗)時,會執行下列演算法
-
每個候選項的屬性值都會與使用者要求的屬性值進行比對。如果候選項的值與使用者的值完全相符、通過屬性的相容性規則,或未提供值,則該候選項會被視為相容。
-
如果只有一個候選項被視為相容,則該候選項獲勝。
-
如果有多個候選項相容,但其中一個候選項與其他候選項相符的所有屬性都相同,則 Gradle 會選擇該候選項。這是具有「最長」相符項的候選項。
-
如果有多個候選項相容,而且相容的屬性數量相等,則 Gradle 需要對候選項進行消歧義。
-
對於每個要求的屬性,如果候選項沒有與消歧義規則相符的值,則會將其從考量中排除。
-
如果屬性具有已知的優先順序,則 Gradle 會在只有一個候選項剩餘時停止。
-
如果屬性沒有已知的優先順序,則 Gradle 必須考量所有屬性。
-
-
如果仍有多個候選項剩餘,則 Gradle 會開始考量「額外」屬性,以在多個候選項之間進行消歧義。額外屬性是指使用者未要求,但至少存在於一個候選項上的屬性。這些額外屬性會按照優先順序進行考量。
-
如果屬性具有已知的優先順序,則 Gradle 會在只有一個候選項剩餘時停止。
-
在考量完所有具有優先順序的額外屬性後,如果剩餘的候選項與所有非順序消歧義規則相容,則可以選擇這些候選項。
-
-
如果仍有多個候選項剩餘,則 Gradle 會再次考量額外屬性。如果候選項的額外屬性數量最少,則可以選擇該候選項。
如果在任何步驟中都沒有候選項保持相容,則解析會失敗。此外,Gradle 會輸出從步驟 1 開始的所有相容候選項清單,以協助除錯變異比對失敗。
外掛程式和生態系統可透過實作相容性規則、消除歧義規則,並告知 Gradle 屬性的優先順序,來影響選取演算法。優先順序較高的屬性用於依序消除相容的配對。
例如,在 Java 生態系統中,org.gradle.usage
屬性比 org.gradle.libraryelements
具有更高的優先順序。這表示如果兩個候選項目具有 org.gradle.usage
和 org.gradle.libraryelements
相容的值,Gradle 將選取通過 org.gradle.usage
消除歧義規則的候選項目。