【问题标题】:How to move a gradle function from build.gradle into a plugin?如何将 gradle 函数从 build.gradle 移动到插件中?
【发布时间】:2015-05-24 11:31:48
【问题描述】:

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

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

我想将此代码移动到插件中,这将使实用程序方法在应用插件的项目中可用。我怎么做?是 project.extension 吗?

【问题讨论】:

    标签: gradle


    【解决方案1】:

    这似乎可以使用:

    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。 &lt;&lt; 已弃用,因此我使用了 .doFirst() 并声明了 HelloTask(){...} 本身。然后事情奏效了。 :) 但是,如果插件不是 happy 机制来提供通用方法 -- 使用 Gradle 提供可重用构建工具的方法是什么?!
    【解决方案2】:

    我最近实现了这个,一个完整的例子可以在Github获得。

    注入基本上归结为

    target.ext.utilityMethod = SomeClass.&utilityMethod
    

    当心:
    此方法可能会与其他一些插件发生冲突,因此您应该考虑是否改为使用 静态导入

    基于Answer 23290820

    【讨论】:

      【解决方案3】:

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

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

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

      更多详情here.

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

      【讨论】:

      • 这确实提供了一种方法。我希望该方法在插件中的原因是因为它似乎是我可以访问项目对象的唯一方法,如果我没有在 build.gradle 本身中定义该函数,那么它就变得不可用了。
      • stackoverflow.com/questions/29184282/…我为什么要探索这个......
      猜你喜欢
      • 1970-01-01
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 2017-07-02
      • 1970-01-01
      相关资源
      最近更新 更多