我正在從 Gradle 遷移到 Bazel。
我在我的 gradle 中建立了testImplementation對io.kotest:kotest-runner-junit5:5.4.2. 它完美地作業。
我將相同的依賴項添加到我的 Bazel 組態檔(WORKSPACE 和 BUILD)中,但出現編譯錯誤,就好像該庫不存在一樣。
我去檢查一下 Bazel 是否沒有帶來傳遞依賴,但確實如此。
我檢查了庫的 POM,結果發現它沒有依賴項。
我在 Maven 中看到有另一個叫io.kotest:kotest-runner-junit5-jvm:5.4.2.
我用那個代替。瞧,它起作用了!
但為什么?gradle 是如何選擇-jvm工件的呢?
uj5u.com熱心網友回復:
你的問題有3個部分
- Gradle 有哪些變體可用?
- Gradle 如何找到變體?
- Gradle 如何確定如何選擇正確的變體?
簡短的回答是
- Gradle 發布了一個額外的
因為是 JSON,我們可以往里面看。有一些元資料
{ "formatVersion": "1.1", "component": { "group": "io.kotest", "module": "kotest-runner-junit5", "version": "5.4.2", "attributes": { "org.gradle.status": "release" } }, ...還有一個
variants陣列。變體之一是-jvm變體,以及 aavailable-at.url,它是鏈接到 Maven 存盤庫中可用變體的相對路徑。... "variants": [ ... { "name": "jvmRuntimeElements-published", "attributes": { "org.gradle.category": "library", "org.gradle.libraryelements": "jar", "org.gradle.usage": "java-runtime", "org.jetbrains.kotlin.platform.type": "jvm" }, "available-at": { "url": "../../kotest-runner-junit5-jvm/5.4.2/kotest-runner-junit5-jvm-5.4.2.module", "group": "io.kotest", "module": "kotest-runner-junit5-jvm", "version": "5.4.2" } } ... ] }這就是 Gradle發現可用變體的方式。
變體選擇:屬性匹配
模塊中實際上有幾個變體,如果啟用更多 Kotlin Multiplatform 目標,還會有更多變體,所以最后一個問題是“Gradle 如何確定需要什么變體?”
答案來自
"attributes"與變體相關聯的那些。它們只是 Gradle 用來匹配所需內容和可用內容的鍵值字串。https://docs.gradle.org/current/userguide/variant_attributes.html#attribute_matching
屬性可能會說
我想要一個用于 org.company:some-artifact:1.0.0 的 Java 8 JAR
或者
我想要 io.kotest:something:2.0.0 的 Kotlin Native 1.7.0 源檔案
它們只是鍵值字串,所以它們實際上可以是任何東西。我創建了用于共享 TypeScript 檔案或 JaCoCo XML 報告檔案的屬性。
為什么我們在寫 Gradle 檔案的時候看不到這些屬性?
在 Gradle 中添加依賴項時
// build.gradle.kts plugins { kotlin("jvm") version "1.7.20" } dependencies { testImplementation("io.kotest:kotest-runner-junit5:5.4.2") }沒有屬性。那么 Gradle 是如何知道選擇
-jvm變體的呢?Gradle 看到您使用 添加了一個依賴項
testImplementation,它是一個Configuration。(旁白:我認為“配置”這個名稱令人困惑。它不是專案行為方式的配置。我更喜歡將其想象成一組海軍戰艦可能有戰斗的“配置”或“配置”用于加載耗材。更多的是關于“形狀”,而不是關于控制 Gradle 屬性或操作。)
定義配置后,它們也被標記為屬性,Gradle 將使用這些屬性在“kotest-runner-junit5”請求和它在注冊存盤庫中發現的內容之間進行匹配
在 的情況下
testImplementation("io.kotest:kotest-runner-junit5:5.4.2"),Gradle 可以看到testImplementation具有“我需要一個 JVM 變體”的屬性,并且它可以使用 Maven Central 中的模塊元資料找到匹配的依賴項。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/511773.html標籤:行家科特林毕业典礼虚拟机
上一篇:java或spring中類路徑的根目錄可以有包名嗎?
下一篇:AndroidGradle插件僅支持kotlin-android-extensionsGradle插件版本1.6.20及更高版本
