如何将Gradle脚本插件转换为二进制插件

时间:2018-04-07 20:47:44

标签: gradle gradle-plugin

我有一堆这样的gradle脚本插件https://github.com/docToolchain/docToolchain/blob/master/scripts/exportExcel.gradle,并希望将它们变成“真正的”二进制插件,以便轻松分发它们。

我知道我可以通过http引用脚本插件,但这不如真正的插件那么好。

正如我所看到的,编写插件的一种方法是实现org.gradle.api.Plugin接口。这基本上意味着我必须重写所有的mit脚本插件。

还有另一种方法可以轻松将它们变成二进制插件吗?也许某种包装?

1 个答案:

答案 0 :(得分:2)

您的脚本似乎很容易转换为插件。

为什么你说你必须重写你的脚本?据我所知,这基本上是在处理一些小细节并添加所有样板/元数据的问题。

我写了很多插件,这是一个非常简单的插件:https://github.com/renatoathaydes/pony-gradle-plugin

这是您需要更改以制作真正的插件:

  1. 为您喜欢的JVM语言创建一个普通的Gradle项目。
  2. buildScript块中,在com.gradle.publish:plugin-publish-plugin:0.9.10上添加类路径依赖项并应用com.gradle.plugin-publish插件。 Example
  3. gradleApi()上添加编译依赖项。 Example
  4. pluginBundle配置添加到构建文件中。 Example
  5. 创建一个实现org.gradle.api.Plugin<org.gradle.api.Project>接口的类。 Example
  6. apply方法中配置插件(为您提供Project的句柄)。这包括向项目添加您可能需要的任何任务。
  7. 为每项任务创建一个扩展org.gradle.api.DefaultTask(通常)的类。 Example
  8. 在某些方法中实现任务的逻辑,使用@org.gradle.api.tasks.TaskAction注释方法。 Example
  9. 使用META-INF/gradle-plugins/plugin-name.properties之类的条目在implementation-class=your.plugin.Class创建一个描述符。 Example
  10. 基本上就是这样!

    您可能想要使插件可配置,Gradle docs显示如何执行此操作,但这是为方便起见的当前示例:

    class GreetingPluginExtension {
      String message = 'Hello from GreetingPlugin'
    }
    
    class GreetingPlugin implements Plugin<Project> {
      void apply(Project project) {
        // Add the 'greeting' extension object
        def extension = project.extensions.create('greeting', GreetingPluginExtension)
        // Add a task that uses configuration from the extension object
        project.task('hello') {
            doLast {
                println extension.message
            }
        }
      }
    }
    

    然后可以在用户的​​构建文件中使用,如下所示:

    greeting {
        message = 'Hi'
    }
    

    要在Gradle Portal中实际发布插件,您需要创建一个帐户... see this以获取更多详细信息。 (或者你可以在Bintray上发布它,但是你的用户应用你的插件会有点尴尬 - 另一方面Bintray作为一个存储库要好得多,所以我最终做了两个,看看上面的例子)。