如何将build.gradle中的gradle函数移动到插件中?

8

目前,在多项目设置中,我在顶级build.gradle文件中定义了几个实用函数,例如:

def utilityMethod() {
    doSomethingWith(project) // project is magically defined
}

我希望将这段代码移动到一个插件中,让utilityMethod在应用该插件的项目中可用。我该怎么做?是一个project.extension吗?
3个回答

3

这似乎可以使用以下方法解决:

import org.gradle.api.Plugin
import org.gradle.api.Project

class FooPlugin implements Plugin<Project> {
    void apply(Project target) {
        target.extensions.create("foo", FooExtension)
        target.task('sometask', type: GreetingTask)
    }
}
class FooExtension{
    def sayHello(String text) {
        println "Hello " + text
    }
}

然后在客户端 build.gradle 文件中,您可以这样做:
task HelloTask << {
    foo.sayHello("DOM")
}

c:\plugintest>gradle -q HelloTask
Hello DOM

https://docs.gradle.org/current/userguide/custom_plugins.html


这种方法在Gradle 4.4中对我不起作用。<<已被弃用,因此我使用了.doFirst(),并声明了HelloTask(){...}本身。然后事情就顺利了。:) 然而,如果插件不是提供常见方法的“快乐”机制——那么使用Gradle提供可重用的构建工具的方式是什么?! - will

3

我最近实现了这个功能,完整的示例可在Github上找到。

注入基本上可以归结为

target.ext.utilityMethod = SomeClass.&utilityMethod

注意:
这种方法可能会与其他插件产生冲突,因此您应该考虑使用静态导入

基于答案23290820


0

插件不应该提供常见方法,而是提供任务

当涉及到扩展时,它们应该用于收集应用插件的输入:

大多数插件需要从构建脚本中获取一些配置。 一种实现这个目的的方法是使用扩展对象。

更多细节在这里

看看彼得的答案,使用通过ext传递的闭包可能是您要寻找的。


那确实提供了一种方法。我希望该方法在插件中,因为似乎这是我唯一可以访问项目对象的方式,如果我不在build.gradle本身中定义函数,那么该对象将不可用。 - Christian Goetze
我正在探索这个问题的原因,请参考http://stackoverflow.com/questions/29184282/how-can-i-override-a-gradle-api-method。 - Christian Goetze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接