【发布时间】:2015-05-24 11:31:48
【问题描述】:
目前,我在多项目设置的顶层 build.gradle 中定义了一些实用函数,例如:
def utilityMethod() {
doSomethingWith(project) // project is magically defined
}
我想将此代码移动到插件中,这将使实用程序方法在应用插件的项目中可用。我怎么做?是 project.extension 吗?
【问题讨论】:
标签: gradle
目前,我在多项目设置的顶层 build.gradle 中定义了一些实用函数,例如:
def utilityMethod() {
doSomethingWith(project) // project is magically defined
}
我想将此代码移动到插件中,这将使实用程序方法在应用插件的项目中可用。我怎么做?是 project.extension 吗?
【问题讨论】:
标签: gradle
这似乎可以使用:
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
【讨论】:
<< 已弃用,因此我使用了 .doFirst() 并声明了 HelloTask(){...} 本身。然后事情奏效了。 :) 但是,如果插件不是 happy 机制来提供通用方法 -- 使用 Gradle 提供可重用构建工具的方法是什么?!
我最近实现了这个,一个完整的例子可以在Github获得。
注入基本上归结为
target.ext.utilityMethod = SomeClass.&utilityMethod
当心:
此方法可能会与其他一些插件发生冲突,因此您应该考虑是否改为使用 静态导入。
【讨论】:
【讨论】: