Plugins 从gradle扩展访问配置闭包

Plugins 从gradle扩展访问配置闭包,plugins,gradle,Plugins,Gradle,我正在编写一个插件,其中可以执行以下操作: project.extensions.create('myExtension', new MyExtension(project)) 其中MyExtension是定义我的新功能的类 现在,在gradle.build中,我可以执行以下操作: myExtension { // configure cool stuff } 我现在想做的是“使用”这个configure闭包中的一些东西,并使用project.configure(myTask,clo

我正在编写一个插件,其中可以执行以下操作:

project.extensions.create('myExtension', new MyExtension(project))
其中
MyExtension
是定义我的新功能的类

现在,在
gradle.build
中,我可以执行以下操作:

myExtension {
    // configure cool stuff
}
我现在想做的是“使用”这个configure闭包中的一些东西,并使用
project.configure(myTask,closure)
将闭包的其余部分按原样传递给我定义的任务。然而,我不知道该怎么做

  • MyExtension
    类访问configure闭包

  • “使用”一些闭包,即访问闭包上的一些属性,然后剥离它们,留下另一个闭包,该闭包包含所有未触及的内容,但没有其他内容


  • 任何指针都将非常感谢=)

    这不是扩展的工作方式。立即计算闭包以配置扩展对象。在那之后,关闭就不复存在了。通常,插件将使用扩展对象(包含在扩展对象中的信息)来进一步配置任务


    PS:它是
    extensions.create('myExtension',myExtension,project)
    ,而不是
    project.extensions.create('myExtension',new myExtension(project))
    ,您可以做的一件事是在扩展上调用一个方法,并将“配置”作为一个闭包提供。所以不是

    //build.gradle
    myExtension{
    //配置酷东西
    }
    
    你写

    //build.gradle
    myExtension.config{
    //配置酷东西
    }
    
    扩展类中相应的方法如下所示:

    //MyExtension.groovy
    类MyExtension{
    工程项目
    MyExtension(项目){
    this.project=project
    }
    def配置(关闭cl){
    //用闭包做点什么
    }
    }
    

    但是,由于整个闭包被转发到您自己的代码中,您将失去Gradle通常对配置闭包进行的所有评估。

    OK。但是你会推荐什么方法来实现我的目标呢?扩展将配置一个复制任务(或者更确切地说是一个从
    copy
    继承的自定义任务),但也会做一些其他的事情,我希望避免为配置
    copy
    操作的每种方法都实现包装器。扩展是否应该扩展
    复制
    ?这有意义吗?如果没有更多的上下文,很难说,但是配置一个
    复制
    任务并做一些其他事情可能是不可取的。扩展意味着比任务更高级别的抽象,涵盖了80%的情况。通常,不建议从Gradle任务类继承;相反,自定义任务类应该公开自己的API,如果需要,还应该委托给
    project.copy
    方法。或者,一个自定义插件可以同时带来一个
    复制任务和一个自定义任务,并使其中一个任务依赖于另一个任务。好的,一些上下文:我试图做的只是一个更可自定义的发布插件,它处理版本编号,并决定发布时从何处以及从何处复制构建输出。在写这篇评论时,我意识到包装复制任务可能比扩展它更好,并在扩展类型中添加方法以将闭包转发给复制任务。这有意义吗?是不是更像“gradle-y”?