簡體   English   中英

Gradle Kotlin DSL:子項目和插件的問題

[英]Gradle Kotlin DSL: Problems with subprojects and plugins

搖籃 6.1.1

我一直在嘗試使用 Kotlin DSL 轉換我的項目的 gradle 文件,但到目前為止失敗了。 我所有的項目都是用 Java 構建的多項目。 我在這里遵循了插件子項目示例

它看起來像這樣:

plugins {
    idea
    eclipse
}

subprojects {
    apply(plugin = "java")

    dependencies {
       implementation("com.google.guava:guava:28.1-jre")
       //...
    }
}

子項目中似乎沒有理解 java 插件,並且所有“實現”行都得到了未解析的引用。

請參閱此處的文檔https://docs.gradle.org/current/userguide/kotlin_dsl.html

類型安全訪問器不可用於由以下貢獻的模型元素:

  • 通過 apply(plugin = "id") 方法應用的插件
  • ...
 implementation()

是這樣一個類型安全的訪問器。 非類型安全方式如下所示:

    apply(plugin = "java-library")
    dependencies {
        "api"("javax.measure:unit-api:1.0")
        "implementation"("tec.units:unit-ri:1.0.3")
    }

使用 groovy DSL,所有方法都是動態解析的(不是類型安全的),所以沒關系。

理解 build.gradle.kts 文件不是純 kotlin 文件會有所幫助。 如果頂部有大量進口,它們看起來會更丑。 因此,gradle 運行時會特殊對待“buildscript”和“plugins”塊。 “插件”被轉換成導入語句。 這不適用於 apply() 方法,該方法稍后在編譯文件時運行。 這也是 plugins 塊不能在其他地方使用的原因,它是一種特殊的構造,只是假裝是一個普通的代碼塊。 這里有更多細節https://docs.gradle.org/current/dsl/org.gradle.plugin.use.PluginDependenciesSpec.html

建議

僅從模塊設計的角度來看,我通常建議多模塊構建中的根模塊仍然不知道子模塊的作用,即使有很多人像您的示例那樣使用子項目塊。 讓每個子模塊構建文件像一個獨立的 gradle 項目一樣完整,這樣讀者就不必閱讀 2 個文件來了解全貌。

有更好的明確方式在子項目之間共享配置。

如果需要從項目的根目錄 IMO 中添加額外的任務,最好使用根文件中的子項目塊。 不要注入插件或配置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM