如何在groovy中重用描述相似ant构建逻辑的代码块?

如何在groovy中重用描述相似ant构建逻辑的代码块?,groovy,ant,gradle,Groovy,Ant,Gradle,如何在groovy中重用描述相似ant构建逻辑的代码块 如果我们有Groovy AntBuilder实现的构建逻辑,就像下面的代码: ant.someTask(attr1:value1, attr2:value2) { configuration1(param1:args1, param2:args2){ similiarStructure(additionalArgs:aaa){ setting1(param5:value5) {

如何在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中的语句
我尝试预定义闭包并将它们注入两种配置中,

但在初始化闭包时失败,并出现属性未找到异常

我将提供两个答案,以便您可以选择哪一个更适合您的用例并进行测试。解决方案取决于您想要共享配置的级别

如果您愿意简单地共享与
类似结构
一起使用的闭包,那么解决方案很简单:

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)
    }
}

类似结构的方法应确保正确配置了
sharedConfig
闭包。我还没有测试过这个,所以我不能完全确定。这种方法的缺点是您必须复制带有参数的
类似结构调用。

我将提供两个答案,以便您可以选择哪个更适合您的用例并对其进行测试。解决方案取决于您想要共享配置的级别

如果您想要一个更通用的解决方案,允许您共享整个
类似结构
块,则需要执行一些更高级的工作。诀窍是确保正确设置共享配置闭包的委托:

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\u FIRST
OWNER\u FIRST
(默认值)在这里都可以正常工作。如果您遇到名称解析问题(缺少方法或属性),您应该尝试切换解析策略。

我更喜欢这一种。它教我如何重用groovy闭包。非常感谢你!