如何将 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.
目前,我在多项目设置中的顶层 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.