![](/img/trans.png)
[英]How to use plugin version from gradle.properties in Gradle Kotlin DSL?
[英]How to access properties from a plugin in a Kotlin DSL gradle script?
我有一個 kts gradle buildscript,其中使用了這個插件。
該插件將project.version
屬性設置為字符串並添加了一些其他屬性:
雖然 version 屬性是一個字符串,但它確實公開了一些額外的屬性。 它們是
snapshot
、major
、minor
、patch
和preRelease
。
現在,如何從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.