向gradle插件扩展添加对象实例

向gradle插件扩展添加对象实例,gradle,Gradle,我有一个类似下面的插件,其中有一个外部名称空间,其中有一个对象的单个“具体”实例(mother)和另一个集合(children) 系列{ 母亲{ firstname='John' lastname='Cleese' } 孩子们{ 儿子{ firstName='John' lastName='Cleese' } 女儿{ firstName='Jane' lastName='Cleese' } } } 我能够添加集合对象并根据我看到的各种示例读取变量,但不确定如何添加具体实例。 如何在扩展对象上定

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

系列{
母亲{
firstname='John'
lastname='Cleese'
}
孩子们{
儿子{
firstName='John'
lastName='Cleese'
}
女儿{
firstName='Jane'
lastName='Cleese'
}
}
}
我能够添加集合对象并根据我看到的各种示例读取变量,但不确定如何添加具体实例。
如何在扩展对象上定义它

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

import org.gradle.api.DefaultTask
导入org.gradle.api.tasks.TaskAction
导入org.gradle.api.NamedDomainObjectContainer
导入org.gradle.api*
班主任
{
最终字符串名
字符串名
字符串姓氏
Person(字符串名){this.name=name}
}
类家族扩展{
最终名称DdoMainObjectContainer子项
人母
人父
家庭扩展(儿童){
这就是孩子
}
def儿童(关闭){
配置(闭包)
}
}
类FamilyPlugin实现插件{
无效申请(项目){

project.task('sayHello',type:DefaultTask)我遇到了与您类似的问题,但我知道如何在我的案例中创建“母亲”,而不是“孩子”。我实现这一点的方法是使用嵌套的扩展对象

下面是我是如何做到这一点的(我的是纯java,所以您可能需要在Groovy中进行一些更改-我对Groovy非常陌生,所以我不确定到底需要更改什么):

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

public FamilyExtension(NamedDomainObjectContainer<Person> children) {
    ((ExtensionAware) this).getExtensions().create("mother",Person.class);
    this.children = children;
}
编辑: 另一种方法是在扩展对象上定义一个函数,该函数接受闭包并将闭包委托给一个新的母对象。然后,您可以使用布尔标志强制执行仅一个母对象的要求

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;
}
private boolean mother\u defined=false;
个人母亲\u value=null;//或个人母亲=新人()
公共无效母亲(关闭){
if(mother_defined){抛出新异常(“只允许一个mother”);}
母亲价值=新人();
motherdef.setDelegate(母亲);
motherdef.call();
母亲定义为真;
}

好的,要将
母亲
闭包添加到
家族
中,您需要将以下代码添加到
家族扩展
类中

个人母亲(结束){
母亲=新人()
项目。配置(母亲,结束)
归来的母亲
}
如果同时希望在family one中有
子项
扩展,请将以下代码添加到
FamilyPlugin.apply
方法中

project.extensions.create(“family”,FamilyExtension,实例化器,project)
project.family.extensions.create(“children”,FamilyExtension.children,project)
然后你加上

void-son(闭包){
人子=新人()
项目。配置(子,结束)
儿童。添加(子)
}
能够在
子对象
子对象中添加
子对象
闭包


要查看整个项目和更多详细说明,请访问Github项目

不确定您想要实现什么。添加对在母亲或单身母亲身上设置
firstname
lastname
的支持?我想在单身母亲身上设置name值,但更一般地说,我想了解我是如何做到的这是DSL中ObjectContainers和“plain”对象的混合。我还没有发现任何示例项目同时使用这两个对象,也没有发现如何在扩展上设置不使用configure(closure)的对象这似乎是DSL扩展开发的一个很好的例子,但是在Kotlin中实现这个项目怎么样?我们可以不用Groovy特有的闭包类型来完成这个项目吗?这是一个非常有用的答案。如果您能够包含每个代码块的文件名,那么它就不是一个猜谜游戏,但是我能够做到这是最奇怪的部分:
((ExtensionAware)This)
。我的第一个想法是使用一个闭包的方法。
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;
}