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”?