如何重用代码块来描述groovy中类似的ant构建逻辑?
如果我们有构建由Groovy AntBuilder实现的逻辑,就像下面的代码一样:
ant.someTask(attr1:value1, attr2:value2) {
configuration1(param1:args1, param2:args2){
similiarStructure(additionalArgs:aaa){
setting1(param5:value5) {
//...blah blah blah
}
//further more settings, may be or may be not the same with similiarStructure below
}
}
configuration2(param3:args3, param4:args4){
similiarStructure(additionalArgs:aaa){
setting1(param5:value5) {
//...blah blah blah
}
//further more settings, may be or may be not the same with similiarStructure below
}
}
}
有没有办法重用Groovy AntBuilder代码块,可以简要介绍配置2中的语句?
我尝试预先定义闭合并将它们注入两种配置中
但是在初始化闭包时失败并且找不到属性。
答案 0 :(得分:1)
我将提供两个答案,以便您可以选择哪一个更适合您的用例并进行测试。解决方案取决于您希望共享配置的级别。
如果您愿意简单地分享与similarStructure
一起使用的闭包,那么解决方案很简单:
def sharedConfig = {
setting1(param5:value5) {
//...blah blah blah
}
}
ant.someTask(attr1: value1, attr2: value2) {
configuration1(param1:args1, param2:args2) {
similarStructure(additionalArgs:aaa, sharedConfig)
}
configuration2(param3:args3, param4:args4) {
similarStructure(additionalArgs:aaa, sharedConfig)
}
}
similarStructure
方法应确保正确配置sharedConfig
闭包。我还没有对此进行过测试,所以我并不完全确定。这种方法的缺点是您必须使用其参数复制similarStructure
调用。
答案 1 :(得分:1)
我将提供两个答案,以便您可以选择哪一个更适合您的用例并进行测试。解决方案取决于您希望共享配置的级别。
如果您想要一个更通用的解决方案,允许您共享整个similarStructure
块,您需要执行一些更高级的工作。诀窍是确保共享配置闭包的委托设置正确:
def sharedConfig = {
similarStructure(additionalArgs:aaa) {
setting1(param5:value5) {
//...blah blah blah
}
}
}
ant.someTask(attr1: value1, attr2: value2) {
configuration1(param1:args1, param2:args2){
applySharedConfig(delegate, sharedConfig)
}
configuration2(param3:args3, param4:args4){
applySharedConfig(delegate, sharedConfig)
}
}
void applySharedConfig(builder, config) {
def c = config.clone()
c.resolveStrategy = Closure.DELEGATE_FIRST
c.delegate = builder
c.call()
}
尽管applySharedConfig()
方法看起来很难看,但它可用于在不同任务之间共享多个配置。
这个解决方案要记住的一点是,闭包的resolveStrategy
非常重要。我认为DELEGATE_FIRST
和OWNER_FIRST
(默认值)都可以正常使用。如果您遇到名称解析问题(缺少方法或属性),您应该尝试切换解决方案策略。