Plugins 编写带有嵌套扩展对象的gradle插件

Plugins 编写带有嵌套扩展对象的gradle插件,plugins,gradle,Plugins,Gradle,我正在开发一个与Asgard(来自netflix)集成的gradle插件(我不知道groovy,刚刚开始使用gradle)。我希望我的扩展对象对用户来说如下所示: asgard{ url=”http://asgard" 地区{ “美国东部1号”{ 自动缩放{ { devPhase=“测试” 最小值=3 最大值=6 可用区=[“美国东部-1a”、“美国东部-1b”、“美国东部-1c”] ami=“基本ami 2013-07-11” instanceType=“m3.xlarge” security

我正在开发一个与Asgard(来自netflix)集成的gradle插件(我不知道groovy,刚刚开始使用gradle)。我希望我的扩展对象对用户来说如下所示:

asgard{
url=”http://asgard"
地区{
“美国东部1号”{
自动缩放{
{
devPhase=“测试”
最小值=3
最大值=6
可用区=[“美国东部-1a”、“美国东部-1b”、“美国东部-1c”]
ami=“基本ami 2013-07-11”
instanceType=“m3.xlarge”
securityGroups=[“基本”,“测试应用程序”]
}
}
}
}
}
或者类似的东西。我已经能够通过自动缩放列表来接近这一点,但每当我试图从该类中获取属性时,它似乎会返回动态属性,而不会返回值。以下是入门插件:

import org.gradle.internal.reflect.Instantiator
类AsgardPlugin实现插件{
无效申请(项目){
project.extensions.create(“asgard”,asgard,project)
project.asgard.extensions.regions=project.container(AsgardRegion){String name->
AsgardRegion=project.gradle.services.get(实例化器).newInstance(AsgardRegion,名称)
断言ExtensionAware的区域实例
region.extensions.add(“自动缩放”,project.container(AsgardAutoScaling))
返回区
}
project.task('displayConfigs')
println“\t区域$region.name”
println“\tAutoScaling组…”
region.autoScaling.each(){asg->
println“\t\tdevPhase$asg”
println“\t\tdevPhase$asg.devPhase”
println“\t\tdevPhase$asg.get('devPhase')”
}
}
}
}
}
类asgard{
字符串url=”http://asgard.sisa.samsung.com"
字符串应用程序名
ASGARDA张力(项目){
applicationName=project.name
}
}
类Asgard区域{
定义字符串名称
列表自动缩放
AsgardRegion(字符串名){this.name=name}
}
类自动缩放{
字符串devPhase
整数分钟
整数最大值
列出可用区域
字符串ami
字符串实例类型
弦乐
列出安全组
}
当我运行任务时,我在日志中看到:

$。/gradlew显示配置
:displayConfigs
Asgard URLhttp://asgard
应用程序名gradle asgard插件
在区域上运行。。。
美国东部1区
自动缩放组。。。
按需创建属性(也称为动态属性)已被弃用,并计划在Gradle 2.0中删除。请阅读http://gradle.org/docs/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html 有关替换动态特性的信息,请参见。
不推荐使用的动态属性:“AsgardRegion”上的“devPhase”_Decorated@65087be0,值:“测试”。
不推荐使用的动态属性“AsgardRegion”上的“min”_Decorated@65087be0,值为:“3”。
不推荐使用的动态属性“AsgardRegion”上的“max”_Decorated@65087be0,值为:“6”。
不推荐使用的动态属性:“AsgardRegion”上的“availabilityZones”_Decorated@65087be0,值:“[us-east-1a,us-east-1…”。
不推荐使用的动态属性:“AsgardRegion”上的“ami”_Decorated@65087be0,值:“基础AMI 2013-07-11”。
不推荐使用的动态属性:“AsgardRegion”上的“instanceType”_Decorated@65087be0,值:“m3.xlarge”。
不推荐使用的动态属性:“AsgardRegion”上的“securityGroups”_Decorated@65087be0,值:“[基础,测试应用程序]”。
devPhase
devPhase测试
德普哈斯地区_Decorated@14860315(“devPhase”)
建设成功
总时间:1.996秒
我这样做是不是完全错了?如果不是,我如何从动态属性中获取值(尝试了get和value,但它们似乎不起作用)

谢谢你花时间阅读这篇文章

根据@peter niederwieser反馈进行编辑

感谢peter niederwieser的提示。在接受了您的建议并了解了闭包是如何工作的之后,我想我对如何着手做我想尝试的事情有了更好的理解

以下是该插件的语法:

asgard{
url=”http://asgard"
地区{
“美国东部1号”{
自动缩放{
devPhase=“测试”
最小值=3
最大值=6
可用区=[“a”、“b”、“c”]
ami=“基本ami 2013-07-11”
instanceType=“m3.xlarge”
securityGroups=[“基本”,“测试应用程序”]
}
自动缩放{
devPhase=“阶段”
}
}
“美国西部1号”{
自动缩放{
devPhase=“测试”
}
自动缩放{
devPhase=“阶段”
}
}
}
} 
可在以下位置找到支持此操作的代码:

import org.gradle.internal.reflect.Instantiator
类AsgardPlugin实现插件{
无效申请(项目){
project.extensions.create(“asgard”,asgard,project)
project.asgard.extensions.regions=project.container(AsgardRegion){String name->
AsgardRegion=project.gradle.services.get(实例化器).newInstance(AsgardRegion,名称,项目)
断言ExtensionAware的区域实例
返回区
}
project.task('displayConfigs')
println“\t区域$region.name”
println“\tAutoScaling组…”
region.autoScaling.each(){asg->
println“\t\tdevPhase$asg.devPhase”
}
}
}
}
}
类asgard{
字符串urlgg
字符串应用程序名
ASGARDA张力(项目){
applicationName=project.name
}
}
类Asgard区域{
字符串名
工程项目
列表自动缩放=[]
AsgardRegion(字符串名称,项目){
this.name=name
this.project=project
}
无效自动缩放(闭合){
def asg=新asg自动缩放()
项目。配置(asg,关闭)
自动缩放。添加(asg)
}
}
类自动缩放{
字符串devPhase
整数分钟
整数最大值
列表可用性