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

How to move a gradle function from build.gradle into a plugin?

目前,我在多项目设置中的顶层 build.gradle 定义了一些实用函数,例如:

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

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

插件不是为了提供通用方法而是任务

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

Most plugins need to obtain some configuration from the build script. One method for doing this is to use extension objects.

更多详情here

看看 Peter 的 answer,使用通过 ext 携带的闭包可能就是您要找的。

这似乎适用于:

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

我最近实现了这个,完整的例子可以在 Github.

注入基本上归结为

target.ext.utilityMethod = SomeClass.&utilityMethod

注意:
此方法可能会与其他一些插件发生冲突,因此您应该考虑是否改用 static imports

基于Answer 23290820.