首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何向分级项目中添加新的类型安全访问器?

如何向分级项目中添加新的类型安全访问器?
EN

Stack Overflow用户
提问于 2022-05-27 00:12:42
回答 1查看 336关注 0票数 1

我们有一个插件,它定义了其他属性并将它们添加为扩展属性,如下所示:

代码语言:javascript
复制
project.extra["copyright"] = "Copyright ..."

然后,在构建脚本中,我可以访问以下内容:

代码语言:javascript
复制
project.extra["copyright"]

我只想写:

代码语言:javascript
复制
project.copyright

一些Gradle插件似乎做了类似的事情。我可以访问project.sourceSetsproject.kotlin,即使它们肯定不在Project接口中。

使用IDE,我可以钻研这些方便的方法,然后让我使用一些自动生成的代码,所以我知道它是在某个地方自动生成的,但是我还没有找到任何线索来帮助我们自己的插件实现这一点。Gradle docs 提到类型安全访问器最终使我得以表达这个问题,但文档并没有说明如何添加新的。

我们如何为我们自己的插件获得这种治疗?

EN

回答 1

Stack Overflow用户

发布于 2022-05-29 13:13:10

创建类似DSL的APIS记录在这里:原料药

做起来很容易。这是一个快速指南,还有一些提示。

  1. 定义一个扩展。 导入org.gradle.api.provider.Property接口MyExtension { val版权: Property } 看上去很无聊!重要的是它要么是一个抽象类,要么是一个接口--这样Gradle就可以创建一个新实例(请参阅“有教养的类型”),这就是Gradle魔术的起点。 旁白:我使用了Property<String>而不是String,尽管两者都能工作。我建议使用与懒惰配置兼容的类型。
  2. 注册分机。 导入org.gradle.api.*抽象类MyPlugin : Plugin {重写乐趣应用(项目:项目){ val myExtension: MyExtension = project.extensions.create("myPlugin",MyExtension::class.java) }} 这是神奇的部分。只需根据项目注册扩展,Gradle将使扩展可用,并自动生成Kotlin方便方法。
  3. 应用插件 // build.gradle.kts插件{ id("my-plugin") } myPlugin { copyright.set("blah 2022") } 就这样,Gradle将生成Kotlin DSL访问器。下面是其中一个: // Accessorsajp3oxzka99ro52ctxwv0petb.kt /** *配置myPlugin扩展。*/ org.gradle.api.Project.myPlugin(configure:操作):Unit =(这是org.gradle.api.plugins.ExtensionAware).extensions.configure("myPlugin",配置)
  4. 使用扩展值 回到插件定义,假设您想注册自己的任务: //演示任务抽象类MyTask : DefaultTask() {@get:输入抽象val版权: Property @TaskAction趣味运行(){println(“版权为${copyright.get()}") }} (请注意,与扩展一样,此任务是“托管类型”)。 现在可以注册自定义任务,并为copyright集设置一个默认值。 抽象类MyPlugin : Plugin {重写乐趣应用(项目:项目){ val myExtension: MyExtension = project.extensions.create("myPlugin",MyExtension::class.java) project.tasks.register("myCustomTask",MyTask::class.java) { copyright.set(myExtension.copyright) }} MyExtensionMyTask都使用Property<String>是很好的--实际值将被延迟地评估,并且只有在需要时才会这样做。 现在,如果我运行./gradlew :myCustomTask,我会看到:任务:myCustomTask版权是blah 2022

进一步阅读

  • 如果你想拥有多个版权怎么办?然后您可以创建一个配置容器
  • 如果MyExtension有很多属性,并且您想将它们全部提供给MyTask,那该怎么办?那么您可以使用输入
  • 扩展属性可以有默认值
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72399229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档