将对象实例添加到 gradle 插件扩展

2023-12-19

我有类似下面的插件,其中有一个外部命名空间,其中有一个“具体”实例(mother)一个对象加上另一个集合(children).

family {
  mother {
      firstname = 'John'
      lastname  = 'Cleese'
  }
  children {
      son {
        firstName = 'John'
        lastName  = 'Cleese'
      }
      daughter {
        firstName = 'Jane'
        lastName  = 'Cleese'
      }
  }
}

我能够添加集合对象并根据我见过的各种示例读取变量,但不确定如何另外添加具体实例。
如何在扩展对象上定义它?

显示问题的代码 - 我想添加mother作为插件内的单个实例。

import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.*

class Person
{
  final String name
  String firstName
  String lastName
  Person(String name) { this.name = name }
}

class FamilyExtension {

  final NamedDomainObjectContainer<Person> children
  Person mother
  Person father

  FamilyExtension(children) {
    this.children = children
  }

  def children(Closure closure) {
    children.configure(closure)
  }
}

class FamilyPlugin implements Plugin<Project> {

  void apply(Project project) {
    project.task('sayHello', type: DefaultTask) << { 
      println(
        "Hello ${project.family.children["son"].firstName} " +
        "and hello ${project.family.children["daughter"].firstName} ")
    }

    def children  = project.container(Person)

    project.extensions.create("family", FamilyExtension, children)
  }
}
apply plugin: FamilyPlugin

family {
  // How do I add support for this?
  // mother {
  //     firstname = 'John'
  //     lastname  = 'Cleese'
  // }
  children {
      son {
        firstName = 'John'
        lastName  = 'Cleese'
      }
      daughter {
        firstName = 'Jane'
        lastName  = 'Cleese'
      }
  }
}

我遇到了与你类似的问题,但我想出了如何在我的案例中创建“母亲”,而不是“孩子”。我完成此任务的方法是使用嵌套扩展对象。

以下是我的做法(我的是纯 java 语言,所以您可能需要进行一些更改才能在 Groovy 中执行此操作 - 我对 Groovy 很陌生,所以我不确定到底需要更改什么):

当您在插件中添加扩展时,该类将自动支持 ExtensionAware 接口,因此可以向其添加扩展。在 FamilyExtension 构造函数中添加一个新扩展,首先将该类强制转换为 ExtensionAware:

public FamilyExtension(NamedDomainObjectContainer<Person> children) {
    ((ExtensionAware) this).getExtensions().create("mother",Person.class);
    this.children = children;
}

这只会允许与您完全一样的单身母亲申报。但请注意,它不会只强制执行一个,因为您可以根据需要添加任意多个母亲,但任何后续声明都将导致更改该单个实例上的值,因此实际上只有一个。如果未声明母亲,您也可能会得到一个空值,因此必须对此进行测试(一些演示说这种情况可能会发生,但在我自己的实验中似乎不会发生)。

要获取您的母亲对象,只需将您的扩展转换为 ExtensionAware 并从中检索 Person 类,就像您从项目中获取系列扩展一样

FamilyExtension fext = project.getExtensions().findByType(Person.class)
Person mother = (Person) ((ExtensionAware) fext).getExtensions().findByName("mother")

编辑: 另一种方法是在扩展对象上定义一个函数,该函数接受闭包并将闭包委托给新的母对象。然后,您可以使用布尔标志来强制执行只有一位母亲的要求。

private boolean mother_defined = false;
private Person mother_value = null;  // or Person mother = new Person()

public void mother(Closure<?> motherdef) {
    if (mother_defined) {throw new Exception("Only one mother allowed");}
    mother_value = new Person();
    motherdef.setDelegate(mother);
    motherdef.call();
    mother_defined = true;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将对象实例添加到 gradle 插件扩展 的相关文章

  • Cordova 构建 - 无法解析 com.android.tools.build:gradle:1.5.0

    升级我的机器 Ubuntu 15 10 的 cordova 和 npm 后 我无法使用 cordova 构建新项目 构建指责 graddle 中存在错误 我做了一些研究并找到了一些可能的解决方案 解决方案例如更改版本和 url graddl
  • 在 IntelliJ IDEA 中附加 Gradle 源

    当我使用默认的 gradle 包装器并创建目录选项在 IntelliJ 中创建 Gradle 项目后 我看到项目结构是通过以下命令创建的build gradle file IntelliJ 提示我 您可以配置 Gradle 包装器以使用带有
  • Gradle中的build-by-convention深度解释是什么?

    The 摇篮用户指南 http www gradle org docs current userguide userguide html经常提到 Gradle 是陈述性的和用途按惯例构建 这是什么意思 据我了解 这意味着 例如 在java插
  • 无法使用 Firebase 广告:没有静态方法 zzc(Landroid/os/Bundle;

    我正在尝试将 Firebase 广告库添加到我的项目 该项目已经上线 中 构建工作正常 但当我尝试运行时 它崩溃并出现以下错误 11 16 10 33 13 535 540 540 com dap E AndroidRuntime 致命异常
  • Android Studio 在 Make Project 期间不会编译 Java 库模块的测试类

    我在 Android Studio 2 2 3 中有一个多项目 Gradle 构建 包含 Java 库 core and codegen 和 Android 库 android 模块 Make Project在 Gradle 控制台中显示已
  • 使用动态对象组配置 gradle 插件扩展的正确方法

    我正在尝试编写自己的 gradle 插件 它需要能够配置一组对象 这些对象的数量以及它们的名称取决于用户 用于创建具有高级可定制性的自定义 gradle 插件的 doco 相当差 它提到project container 方法来做这种事情
  • Android Studio gradle 构建时间太长

    My 安卓工作室项目过去构建速度更快 但现在需要很长时间才能构建 有什么想法可能导致延误吗 我努力了https stackoverflow com a 27171878 391401 https stackoverflow com a 27
  • gradle 神器插件

    我是artificialy 和 teamcity 的新手 我尝试使用 gradle artifactory 插件 但它引发了我以下错误 任何人都可以告诉我这个错误是什么并帮助我解决一些问题 Error is Caused by org co
  • Gradle 构建:不支持从任务容器中删除任务

    我正在尝试使用 Ubuntu 终端构建 Gradle 项目 但它向我抛出以下错误 我没有找到任何有价值的解决方案 我使用的是gradle6 0 1 谢谢 失败 构建失败并出现异常 在哪里 脚本 home jamshaid cas serve
  • 使用 Intellij 2017.2 /out 目录构建会重复 /build 目录中的文件

    更新到 Intellij 2017 2 后 构建我的项目会创建一个 out包含生成的源文件和资源文件的目录 这些文件与已包含的文件重复 build并导致duplicate class生成的类的编译器错误 关于 Gradle 或 Intell
  • 应用程序启动时突然出现 Firebase java.lang.IllegalAccessError

    突然发生崩溃安装后应用程序的初始启动 但只是第一次 第二次打开应用程序后它可以正常工作 我没有更改 firebase 代码 但可能是依赖项 但是到最新版本 所以通常它应该是一个稳定的版本 似乎有一些与 firebase 相关的问题 java
  • 使用 Gradle 检测 IDE 环境

    无论如何 有没有办法检测我正在运行我的项目的环境 像这样的事情 构建 gradle def usingIntelliJ def usingAndroidStudio if usingIntelliJ buildConfigField Str
  • 如何在构建持续时间和 RAM 使用方面优化 gradle 构建性能?

    我目前正在为我的多模块 Web 应用程序从 ant 切换到 gradle 目前看来当前版本的 Gradle M9 可能已经达到了极限 但也许 希望 这只是我对 Gradle 概念理解不够好或者不知道 神奇的性能提升开关 的问题 我很高兴收到
  • 如何将库添加到 LIBGDX 项目的依赖项 gradle

    一切都在问题中 我已经尝试了在 SO 和其他网站中找到的所有答案 但没有运气 这就是我迄今为止尝试过的 adding compile fileTree dir lib include jar 到我的 build gradle adding
  • 增强 App Engine Cloud Endpoints Frameworks 2.0 中的端点

    我收到了一封来自 GCP 的电子邮件 要求将我的项目从 Cloud Endpoints 1 0 迁移到 Cloud Endpoints Frameworks 2 0 我已按照此处概述的步骤进行操作 https cloud google co
  • JaCoCo 具有微服务项目架构?

    我的项目由 6 个 Java 微服务组成 我试图弄清楚如何将 Jacoco 的 html 报告合并到一份整体覆盖率报告中 就目前情况而言 我最终为每项服务提供了一份报告 如果能有一份汇总报告就好了 这样我就可以更轻松地将其放入我们的 CI
  • 不同风格的模块文件

    我正在尝试在同一个应用程序中实现播放服务和华为服务 但希望能够按风格配置使用哪一个 每种风格都使用自己的 applicationIdSuffix 因此 对于每种不同的风格 华为插件都会失败 我无法编译 我的应用程序模块包含agconnect
  • “gradlew eclipse”命令不起作用

    我已从以下 URL 签入代码 https github com spring projects spring integration samples https github com spring projects spring integ
  • 如何在 Android 中签署 AAR Artifacts?

    我目前正在开发一个 AAR android 库 我想用我自己的密钥对已发布的工件进行签名 以便我可以确定我是否发布了具有相同名称和功能的假 aar 注意事项1 我希望能够以编程方式检查我的库的真实性 即使是一个伪造的库 只是伪造了我的 aa
  • 错误包括 bouncycastle 提供商

    我需要使用bouncycastle provider我的项目中的库 我已将其包含在 gradle 项目中 apply plugin application sourceCompatibility 1 6 version 1 0 0 main

随机推荐

  • 我如何知道 *.a 文件是针对哪种架构构建的?

    我正在使用 mac OS 10 7 4 使用 Xcode 4 3 2 我有一个来自我的合作伙伴的 a 静态库文件 我想知道它是为哪种架构而构建的 是ARMv6 ARMv7 i386还是其他架构 是否有任何命令或方法可以获取有关文件架构的信息
  • 最终链接失败:包含 windows.h 时参数无效

    我已经使用 CDT 设置了 MinGW 和 Eclipse 以便在 Windows 上进行 C 开发 一切都很顺利 直到我 include
  • 制作 Twitter wordcloud 时运行“tolower”后出现有趣错误

    尝试从 Twitter 数据创建词云 但出现以下错误 Error in FUN X 72L invalid input xxx bla bla bla http t co 56Fb78aTSC in utf8towcs 运行 mytwitt
  • 禁用输出转义不适用于 xslt 中的属性

    我有以下 xml 节点
  • 如何在 Android 中管理可运行任务队列

    我有多个任务 可运行 即从互联网下载图像 它们是当用户滚动 Android 应用程序中的列表时生成的 我无法控制一次生成多少个任务 Runnable 这可能是 100 个 但我只想并行执行 n 10 个任务 因此 我计划构建一个设计 一旦生
  • 始终隐藏虚拟键盘

    实际上我有一个编辑文本 当我单击编辑文本虚拟键盘弹出窗口时 但我只是想即使在单击编辑文本后也始终隐藏虚拟键盘 并且编辑文本应该可以使用系统键盘打印 我该怎么做 我的代码 EditText edtNote EditText findViewB
  • MS Access 触发器?

    我在 MS Access 中有两个名为 Insert Record 和 Delete Record 的表 两个表具有相同的字段 但一个表有记录 而另一个表没有记录 问题 我希望 每当我从表 Insert Record 中删除任何记录时 整个
  • 在 Android L 上运行本机库错误:仅支持位置无关的可执行文件 (PIE)

    当我在 Android L Nexus 5 上运行本机代码时 出现错误 错误 仅支持位置无关的可执行文件 PIE 相同的代码在我的 Samsung Galaxy S3 Android 4 3 上正确执行 这是我的Application mk
  • 是否有“全包同级”CSS 选择器之类的东西?

    My HTML p Doggies p p class green guys Froggies p p Cupcakes p p Piggies p 一个全包兄弟选择器 正如我希望的那样 当用于选择 green guys 的兄弟姐妹时 将选
  • Firebase 和 React 的 useEffect 清理功能

    我有一个问题 我的 useEffect 导致以下警告 无法对已卸载的组件执行 React 状态更新 这是一个空操作 但它表明应用程序中存在内存泄漏 要修复此问题 请取消 useEffect 清理函数中的所有订阅和异步任务 仅当从该组件处于活
  • 如何在 Qt 项目中包含 OpenSSL

    我是 Qt 的新手 我已经做了一些谷歌搜索 但找不到足够详细的答案 我需要在基于 qmake 的 Qt 项目中使用 OpenSSL 我如何下载 安装 链接它 以便我可以执行包含语句并在我的代码中使用它的功能 假设使用 Windows 您可以
  • 通过引用传递 std::string 数组

    我想创建一个不通过引用传递 std string 进行修改的函数 void changeStr std string str str Hello World 而是一个完整的 固定大小的 std strings 数组 该函数将执行完全相同的操
  • AngularJS - 当另一个范围内的键为 true 时更改范围值

    我有一个像这样的 ng repeat li p car model p span span span X span li 基于此 scope cars scope cars model Ford check true model Honda
  • 使用本机登录页面的登录凭据实施 Oauth2

    我正在尝试实现基于 Oauth2 的 Web 服务 我有 clientID clientSecret 授权端点 令牌端点和回调 Url 自定义架构指向 android 本机页面 当我检查其他基于 Oauth2 的 API 时 它有登录 Ur
  • 为乒乓球游戏的神经网络寻找正确的参数

    我在 Pong 游戏中实现深度神经网络时遇到了一些麻烦 因为无论我更改哪些参数 我的网络总是发散 我玩了一个 Pong Game 并实现了一个基于 theano lasagne 的深度 q 学习算法 该算法基于 Google Deepmin
  • 找不到存储过程,但可以执行它

    我是 SQL Server 新手 创建了我的第一个存储过程 它执行得很好 我可以在 可编程性 存储过程 下找到它 因此我弹出一个新查询并输入以下语句 use name of database exec name of stored proc
  • 如何对甘特条进行聚类而不重叠?

    使用 create gantt 我有重叠的开始日期和结束日期 import plotly plotly as py import plotly figure factory as ff import plotly df dict Task
  • 获取应用服务器下的真实(虚拟)主机名

    我有一个在 Jetty 下运行的应用程序 我希望该应用程序返回自引用绝对 URL 生成 RSS 提要时 因此客户端必须能够在没有 当前 URL 上下文的情况下工作 问题是我事先不知道应用程序将部署在哪个主机名下 而且很可能它将部署在多个主机
  • 通过 Powershell 为另一个用户设置环境变量

    我正在尝试从管理员用户 ABC 的 powershell 设置用户 XYZ 的环境变量 我正在使用 Start Process 启动用户 XYZ 的 powershell 但我无法捕获输出 所有这些过程都需要用Java来完成 有人可以帮我吗
  • 将对象实例添加到 gradle 插件扩展

    我有类似下面的插件 其中有一个外部命名空间 其中有一个 具体 实例 mother 一个对象加上另一个集合 children family mother firstname John lastname Cleese children son