目前,在多项目设置中,我在顶级build.gradle文件中定义了几个实用函数,例如:
def utilityMethod() {
doSomethingWith(project) // project is magically defined
}
我希望将这段代码移动到一个插件中,让utilityMethod在应用该插件的项目中可用。我该怎么做?是一个project.extension吗?
目前,在多项目设置中,我在顶级build.gradle文件中定义了几个实用函数,例如:
def utilityMethod() {
doSomethingWith(project) // project is magically defined
}
这似乎可以使用以下方法解决:
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
}
}
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
注意:
这种方法可能会与其他插件产生冲突,因此您应该考虑使用静态导入。
基于答案23290820。
<<
已被弃用,因此我使用了.doFirst()
,并声明了HelloTask(){...}
本身。然后事情就顺利了。:) 然而,如果插件不是提供常见方法的“快乐”机制——那么使用Gradle提供可重用的构建工具的方式是什么?! - will