Gradle Plugin 的创建的两种方式

作者: 未见哥哥 | 来源:发表于2018-08-02 23:10 被阅读13次

    # Gradle Plugin

    思维导图

    插件是一系列 Task 的组合。

    ## 插件可以用来干嘛?

    • 模块化构建脚本的功能
    • 公共的功能可以抽取出来成为插件,可以供多个 build.gradle 使用,增加复用性。

    ## 插件的类型

    • 脚本插件

    是一个构建脚本,只是将构建脚本的一部分抽取到单独的xxx.gradle 文件中,然后再通过 apply from:xxx.gradle 的方式将其引入

    • binary插件

    binary插件是一个实现 Plugin 接口的类,通过程序化的方式去编写插件的构建逻辑。而binary插件的类可以写在项目的buildSrc下。

    ## 插件的使用

    为了将构建脚本的逻辑封装到插件中,Gradle 需要做以下两件事:处理插件应用插件到目标中

    • 处理插件

    Gradle 会自动找到插件所在的位置,并且将其插件添加到script calsspath中,一旦插件被Gradle识别解析,那么就可以在构建脚本中使用这个的插件了。

    • 应用插件

    一旦插件被应用到执行的构建脚本中,那么插件对应的 Plugin.apply(T target)就会调用。

    ## 脚本插件

    • 定义脚本插件

    定义一个 plugin.gradle,脚本如下,主要是创建一个名字为 PluginTask 的任务,为依赖 plugin.gradle 的 project 添加了一个 pluginTask 。

    project.task("PluginTask") {
        doLast {
            println "脚本插件..."
        }
    }
    
    • 依赖脚本插件

    在指定的 build.gradle 中依赖 plugin.gradle

    apply from:插件文件的名称应用时是相对当前 project 所在的文件相对路径。

    apply from: 'plugin.gradle'
    
    • 验证插件是否应用成功

    在应用该插件的module中执行 PluginTask 如果能正确执行 doLast 的内容,那么就表示应用成功了。

    ./gradlew PluginTask
    

    ## Binary 插件

    将插件定义在 buildSrc 中,这里的 buildSrc 就是当前工程下的一个 module ,Gradle 规定当一个module被命名为 buildSrc 时就会被当成插件去处理。

    ### 创建一个最简单的插件吧

    • 创建一个 Java Library 的 module
    • 将 main/src/java 修改为 main/src/groovy


      项目结构
    • 创建类实现 Plugin 接口并覆写 apply(T garget) 接口

    Plugin<T> 是一个泛型接口,在定义插件是应该将这个泛型填为 Project 即可。

    class PluginTest implements Plugin<Project> {
    
        @Override
        void apply(Project project) {
    
            project.task("MyTask") {
                doLast {
                    println "MyTask doLast invoke..."
                }
            }
        }
    }
    
    • 在外部应用这个插件
    //在 app 下的 build.gradle 引用这个插件
    apply plugin: PluginTest
    
    • 验证效果

    app module 引用了这个 PluginTest 插件,因此 app 这个 project 就有 MyTask 这个任务了,我们来执行一下验证一下效果吧。

    ./gradlew :app:MyTask      
    

    ### 资源 ID 标识插件

    定义好插件后,我们是通过以下方式去引用这个插件的。

    //在 app 下的 build.gradle 引用这个插件
    apply plugin: PluginTest
    

    看看下面的我们工程引用 Android 插件的方式就跟我们上面的不一样哦。

    apply plugin: 'com.android.application'
    

    上面这种方式是给插件定义了一个 Plugin ID 。当需要外界需要引用时就不需要引用插件的类名了,其实就相当于起了个别名吧。

    下面来看一下如何来声明插件 ID 的:

    • 如下图所示创建文件

    因为插件类的的包名为 com.example.buildsrc ,所以该文件明就是 包名.properties

    buildSrc结构
    • 文件内容

    文件内容的 implementation-class 对应的值为插件类的全限名称

    implementation-class=com.example.buildsrc.PluginTest
    
    • 引用插件
    apply plugin:'com.example.buildsrc'
    

    好了,就这样,我们也可以定义插件ID的方式像引用 Android 插件一样来引用我们自己的插件咯。

    # 参考

    相关文章

      网友评论

        本文标题:Gradle Plugin 的创建的两种方式

        本文链接:https://www.haomeiwen.com/subject/glsevftx.html