Gradle自定义插件详解

作者: SYfarming | 来源:发表于2017-08-04 11:56 被阅读313次

    关于gradle插件自定义,发现网上好多的错误教程,总结后的文章,若本文中也有错误,请及时指正

    在Gradle中创建自定义插件,Gradle提供了三种方式:

    • 在build.gradle脚本中直接使用
    • 在buildSrc中使用
    • 在独立Module中使用

    开发Gradle插件可以在IDEA中进行开发,也可以在Android Studio中进行开发,它们唯一的不同,就是IDEA提供了Gradle开发的插件,比较方便创建文件和目录,而Android Studio中,开发者需要手动创建(但实际上,这些目录并不多,也不复杂,完全可以手动创建,而且在AS中进行创建有利于进行插件依赖的调试和功能的完善)。

    一.在build.gradle脚本中使用

    在build.gradle脚本中使用是最简单的,但是只适应于很简单的功能,也不便于其他地方应用,如下面,可以直接写在app moudle的build.gradle 里面,sync之后可在右侧model对应的other中查询到MytestPlugin

    根目录下build.gradle

    双击执行,在android studio终端里就可以直接执行此插件:

    执行之后的截图

    由于直接在build.gradle中进行自定义比较简单,这里就不在进行重点的讲解

    二. 在项目里使用

    这里官网的描述 https://docs.gradle.org/4.0.2/userguide/organizing_build_logic.html#multiProjectBuildSrc
    请参考(目前所暂时为最新的gradle4.0.2内容,低版本也兼容此功能)


    根据官网的描述,这里在项目中进行使用的gradle插件过程如下:
    首先在Android Studio中创建一个标准的Android项目,然后在项目的根目录下新建一个model命名为buildSrc,这个目录就用来存放自定义插件,整个目录结构如下所示:

    ├── app  
    │   ├── build.gradle  
    │   ├── libs  
    │   └── src  
    │       ├── androidTest  
    │       │   └── java  
    │       ├── main  
    │       │   ├── AndroidManifest.xml  
    │       │   ├── java  
    │       │   └── res  
    │       └── test  
    ├── build.gradle  
    ├── buildSrc  
    │   ├── build.gradle            ---1  
    │   └── src  
    │       └── main  
    │           ├── groovy          ---2  
    │           └── resources       ---3  
    ├── gradle  
    │   └── wrapper  
    │       ├── gradle-wrapper.jar  
    │       └── gradle-wrapper.properties  
    ├── gradle.properties  
    ├── gradlew  
    ├── gradlew.bat  
    ├── local.properties  
    └── settings.gradle  
    

    我们对新建的model操作过程如下:

    src/main 项目文件下:

    • 移除 java 文件夹,因为在这个项目中用不到 java 代码
    • 添加 groovy 文件夹,主要的代码文件放在这里
    • 添加 resources 文件夹,存放用于标识 gradle 插件的 meta-data
    • 修改src/build.gradle配置内容

    下面是我的一个实际项目:

    项目中使用gradle截图

    其中,除了buildSrc目录以外,其他都是标准的Android目录,而buildSrc就是Gradle提供的在项目中配置自定义插件的默认目录,开发Gradle要创建的目录,也就是RootProject/src/main/groovy和RootProject/src/main/resources两个目录。

    1,创建buildSrc/build.gradle

    首先,先来配置buildSrc目录下的build.gradle文件,这个配置比较固定,使用官网示例,脚本如下所示:

    apply plugin: 'groovy'  
      
    dependencies {  
        compile gradleApi() //gradle sdk  
        compile localGroovy() //groovy sdk  
    }  
    

    2,创建Groovy脚本

    接下来,在groovy目录下,创建一个Groovy类(与Java类似,可以带包名,但Groovy类以.grovvy结尾,所以groovy文件的创建是new->file->custom.groovy),如图所示:

    其中MyPlugin为new出的新文件,全名为MyPlugin.groovy

    在groovy下先创建了子目录,这里类似于java 的package一样,com/myPlugin 目录,再创建MyPlugin.groovy文件:

    package com.myPlugin
    
    import org.gradle.api.Plugin
    import org.gradle.api.Project
    
    public class MyPlugin implements Plugin<Project> {
        @Override
        void apply(Project project) {
            project.task('testPlugin') << {
                println 'hello, world!'
            }
        }
    }
    

    注意:
    groovy 文件夹中的类,一定要修改成 .groovy
    后缀,IDE 才会正常识别。

    这个插件创建了一个名为testPlugin的Task, 并在 task 中打印。插件是一个类,继承自 org.gradle.api.Plugin接口,重载 void apply(Project project)方法,这个方法将会传入使用这个插件的 project 的实例,这是一个重要的 context。

    3,创建resources
    resources目录是标识整个插件的目录,其目录下的结构如下所示:

    └── resources 
     └── META-INF 
       └── gradle-plugins
    

    该目录结构与buildSrc一样,是Gradle插件的默认目录,不能有任何修改。创建好这些目录后,在gradle-plugins目录下创建——插件名.properties文件,如上图所示的: myCustomPlugin.properties文件
    在该文件中,代码如下所示:

    implementation-class=com.myPlugin.MyPlugin//这里的com.myPlugin.MyPlugin指的是上面所创建的包名路径
    

    通过上面的代码指定最开始创建的Groovy类即可。

    在主项目中使用插件
    在主项目的build.gradle文件中,通过apply指令来加载自定义的插件,脚本如下所示:

    apply plugin: 'myCustomGradle'
    

    其中plugin的名字,就是前面创建myCustomPlugin.properties中的名字——myCustomPlugin,通过这种方式,就加载了自定义的插件。

    配置完毕后,就可以在主项目中使用自定义的插件了,在终端执行gradlew testPlugin指令或者在右侧的gradle集成中查找,及app-other:testPlugin任务进行双击,如图:

    plugin命令可点击

    结果如下所示:

    三. 在独立Module中使用

    一个独立的 Groovy 和 Java 项目,可以把这个项目打包成 Jar 文件包,一个 Jar 文件包还可以包含多个插件入口,将文件包发布到托管平台上,供其他人使用。

    在buildSrc中创建自定义Gradle插件只能在当前项目中使用,因此,对于具有普遍性的插件来说,通常是建立一个独立的Module来创建自定义Gradle插件。

    创建过程请参考上节中的

    《二. 在项目里使用》

    却别在于:

    1. 不需要进行model的名称的写死,也就是你可以随意的命名
    2. buildSrc会自动的编译和加入到classpath中,这里我们需要手动依赖
    3. 需要上传到maven仓库中

    其实gradle插件的自定义到这里介绍的也差不多了,由于篇幅的原因,关于maven的上传和插件的依赖我们单独开一章节来描述。以上功能已经全部验证,源码请见:https://github.com/AnyMarvel/GradleStart

    ps:若开发gradle插件比较犀利的情况下,推荐使用IDEA,至少有个提示功能

    未完待续……
    (累了休息会吧,gradle环境跑步起来会吐的,真会吐哦)


    关注微信公众号 Android历练记 或扫一扫二维码:让我们一起来搞事情。

    相关文章

      网友评论

      • 生椰拿铁锤:能给出更多的自定义Gradle功能示例就好了:smiley:
        SYfarming: @Dawish_大D 相关资料太少,冷太多😰😰
        SYfarming: @Dawish_大D 后期会有的,准备做个系列😃😃

      本文标题:Gradle自定义插件详解

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