当前位置: 首页 > 知识库问答 >
问题:

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

公冶谦
2023-03-14

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

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

虽然version属性是一个字符串,但它确实公开了一些其他属性。这些是快照主要次要修补程序预发布

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

尝试<code>val major=project.version之类的方法。由于Kotlin是静态类型的,因此作为整数的主变量总是失败:

未解决的参考:主要

有没有办法访问这些属性,或者我必须回到基于groovy的<code>gradle。构建buildscript?

共有1个答案

毛博
2023-03-14

有趣的问题。该插件使用Groovy元编程来添加这些属性(主要、次要、补丁...)添加到版本属性。< br >据我所知,Kotlin无法访问Groovy的元类属性。< br >插件应该为version属性使用普通的类结构,或者(希望保持version为字符串对象)向项目添加一个专用属性,该属性包含这些值作为新类的属性。但是目前的实现似乎与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并继续html" target="_blank">编译过程以生成常规字节码。与运行时元编程相比,这样做的好处是可以在类文件本身(也就是说,在字节码中)看到变化。例如,如果您希望转换成为类契约的一部分(实现接口、扩展抽象类等等),或者甚至您需要您的类可从Java(或其他JVM语言)中调用,那么让它在字节码中可见是很重要的。例如,AST转换可以向类中添加方法。如果用运行时元编程来实现,那么新方法只能在Groovy中看到。如果您使用编译时元编程做同样的事情,那么该方法在Java中也是可见的。最后但同样重要的是,编译时元编程的性能可能会更好(因为不需要初始化阶段)。

 类似资料:
  • 问题内容: 我在elasticsearch中的索引具有以下映射: 源文档如下: 我正在尝试使用距离脚本来基于地理点计算距离。我在elasticsearch结果中发现了该帖子的Return distance吗?帮我 我正在尝试获取所有结果,按半径1km进行过滤,获取距离,然后对geo_point进行排序。查询的结构如下: 我收到状态为500的以下错误: 我尝试以这种方式重写查询: 然后我得到这个错误

  • npm包允许我们在TypeScript应用程序中使用反应。我们将组件定义为 在这里,我们必须声明组件道具和状态的类型(在类型变量中)。 在我们声明了这些类型之后,TypeScript使用这些类型来验证组件的使用(传递给它的道具的形状)。 我想围绕这样一个组件创建一个容器。容器将重用组件的道具。但是为了用相同的道具创建另一个组件,我必须重新声明道具的类型。或者从原始零部件文件中导出它们并导入到容器中

  • 我想知道是否可以从Jenkins脚本控制台模拟管道插件操作。例如,Slack插件用于使用以下命令通过管道作业发送通知: slackSend(颜色:颜色代码,消息:摘要) 我想尝试到处玩,看看对象和属性。我很确定从Jenkins脚本控制台使用groovy是可能的。

  • 我知道我们无法访问web中的属性。但是有没有解决方法来实现这一点。我只需要访问env在web中的价值。xml文件。 如有任何建议,我们将不胜感激。

  • 我想从groovy管道检查是否收集了特定的文件(工件)。 如何访问文物列表? 请注意,我正在寻找一种不意味着修改收集工件的代码的解决方案。这是因为这段代码在多个地方,我只需要在最后做些事情,而不是在任何可能的存档工件调用中(可以隐藏很深)。

  • 我正在编写一个Groovy脚本来使用SOAP Web服务。首先,我在SOAP中导入了我的WSDL并创建了一个项目。 那么所有的SOAP请求都会自动生成。 现在我尝试编写一个Groovy来使用生成的SOAP请求调用SOAP服务。 现在这是我的时髦脚本 我想访问在SOAPUI-CreateNote中生成的相同SOAP请求。我如何访问它? 我的实际需求是访问Groovy脚本中的所有SOAP请求——这样我