如何从Kotlin DSL gradle脚本中的插件访问属性?

如何从Kotlin DSL gradle脚本中的插件访问属性?,gradle,properties,kotlin,gradle-kotlin-dsl,Gradle,Properties,Kotlin,Gradle Kotlin Dsl,我有一个kts gradle构建脚本,其中使用了这个脚本 插件将project.version属性设置为字符串,并添加一些附加属性: 虽然version属性是一个字符串,但它确实公开了一些额外的 财产。它们是快照,主要,次要,补丁和 预发布 现在,如何从build.gradle.kts访问这些属性 尝试将val-major=project.version.major作为整数这样的操作总是失败,因为Kotlin是静态类型的: 未解决的引用:主要 有没有办法访问这些属性,或者我必须回到基于groov

我有一个kts gradle构建脚本,其中使用了这个脚本

插件将
project.version
属性设置为字符串,并添加一些附加属性:

虽然version属性是一个字符串,但它确实公开了一些额外的 财产。它们是
快照
主要
次要
补丁
预发布

现在,如何从
build.gradle.kts
访问这些属性

尝试将
val-major=project.version.major作为整数这样的操作总是失败,因为Kotlin是静态类型的:

未解决的引用:主要


有没有办法访问这些属性,或者我必须回到基于groovy的
gradle.build
buildscript?

有趣的问题。插件正在使用Groovy元编程将这些属性(主要、次要、补丁…)添加到version属性。
据我所知,Kotlin无法访问Groovy的元类属性。
插件应该为version属性使用普通的类结构,或者(希望将version保持为字符串对象)向项目添加一个专用属性,该属性包含这些值作为新类的属性。但当前的实现似乎与Gradle Kotlin DSL不兼容

这是他们设置
project.version
并向其元类()添加属性的代码部分:

Groovy官方文档实际上记录了运行时元编程对于其他JVM语言是不可见的,而编译时元编程是可见的():

Groovy中的编译时元编程允许在编译时生成代码。这些转换正在改变程序的抽象语法树(AST),这就是为什么在Groovy中我们称之为AST转换。AST转换允许您钩住编译过程,修改AST并继续编译过程以生成常规字节码。与运行时元编程相比,这具有使更改在类文件本身(即字节码)中可见的优点。例如,如果您希望转换成为类契约的一部分(实现接口、扩展抽象类等),则使其在字节码中可见非常重要…​) 或者,即使您需要从Java(或其他JVM语言)调用类。例如,AST转换可以向类添加方法。如果使用运行时元编程,则新方法只能从Groovy中看到。如果使用编译时元编程进行相同操作,则该方法也可以从Java中看到。最后但并非最不重要的一点是,如果满足编译时,性能可能会更好A编程(因为不需要初始化阶段)


虽然有一个插件代码行的特定参考是很好的(保留它),但最好也在这里将相关代码部分添加到您的答案中。到非站点资源的链接可能会随着时间的推移而变得不可用。请确保您的答案是完整的。
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