簡體   English   中英

如何從 Kotlin DSL gradle 腳本中的插件訪問屬性?

[英]How to access properties from a plugin in a Kotlin DSL gradle script?

我有一個 kts gradle buildscript,其中使用了這個插件

該插件將project.version屬性設置為字符串並添加了一些其他屬性:

雖然 version 屬性是一個字符串,但它確實公開了一些額外的屬性。 它們是snapshotmajorminorpatchpreRelease

現在,如何從build.gradle.kts訪問這些屬性?

嘗試像val major = project.version.major as Integer這樣的東西總是失敗,因為 Kotlin 是靜態類型的:

未解決的參考:major

有什么方法可以訪問這些屬性,還是必須回到基於 groovy 的gradle.build構建腳本?

有趣的問題。 該插件使用 Groovy 元編程將這些屬性(主要、次要、補丁...)添加到版本屬性。
據我所知,Kotlin 無法訪問 Groovy 的 MetaClass 屬性。
插件應該為 version 屬性使用普通的類結構,或者(希望將 version 保留為 String 對象)向包含這些值的項目添加專用屬性作為新類的屬性。 但是當前的實現似乎與 Gradle Kotlin DSL 不兼容。

這是他們設置project.version並向其 MetaClass 添加屬性的代碼部分( 源代碼):

project.version = semanticBuildVersion as String

// Attach snapshot boolean-property to version - says whether version is snapshot or not
project.version.metaClass.snapshot = semanticBuildVersion.snapshot

// Attach version components
def versionComponents = project.version.split(/[.-]/, 4)
project.version.metaClass.major = versionComponents[VersionComponent.MAJOR.index] as int
project.version.metaClass.minor = versionComponents[VersionComponent.MINOR.index] as int
project.version.metaClass.patch = versionComponents[VersionComponent.PATCH.index] as int

Groovy 官方文檔實際上記錄了運行時元編程對於其他 JVM 語言不可見,而編譯時元編程是可見的( 鏈接):

Groovy 中的編譯時元編程允許在編譯時生成代碼。 這些轉換正在改變程序的抽象語法樹 (AST),這就是我們在 Groovy 中將其稱為 AST 轉換的原因。 AST 轉換允許您連接到編譯過程、修改 AST 並繼續編譯過程以生成常規字節碼。 與運行時元編程相比,這具有使更改在類文件本身(即字節碼中)可見的優點。 使其在字節碼中可見很重要,例如,如果您希望轉換成為類契約的一部分(實現接口、擴展抽象類……),或者即使您需要可以從 Java(或其他 JVM 語言)調用您的類)。 例如,AST 轉換可以向類添加方法。 如果您使用運行時元編程來執行此操作,則新方法將僅在 Groovy 中可見。 如果您使用編譯時元編程來執行相同的操作,則該方法也將在 Java 中可見。 最后但並非最不重要的一點是,編譯時元編程的性能可能會更好(因為不需要初始化階段)。

暫無
暫無

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

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