Gradle自定义插件

                       

Gradle自定义插件

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

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

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

在项目中使用

在Android Studio中创建一个标准的Android项目,整个目录结构如下所示:

├── 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
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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

 

在配置完成后,如果配置正确,对应的文件夹将被IDE所识别,成为对应类别的文件夹。

创建buildSrc/build.gradle—1

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

apply plugin: 'groovy'dependencies {    compile gradleApi()    compile localGroovy()}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

创建Groovy脚本—2

接下来,在groovy目录下,创建一个Groovy类(与Java类似,可以带包名,但Groovy类以.grovvy结尾),如图所示:

这里写图片描述

在脚本中通过实现gradle的Plugin接口,实现apply方法即可,脚本如下所示:

package com.xysimport org.gradle.api.Pluginimport org.gradle.api.Projectpublic class MainPluginForBuildSrc implements Plugin<Project> {    @Override    void apply(Project project) {        project.task('testPlugin') << {            println "Hello gradle plugin in src"        }    }}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在如上所示的脚本的apply方法中,笔者简单的实现了一个task,命名为testPlugin,执行该Task,会输出一行日志。

创建Groovy脚本的Extension

所谓Groovy脚本的Extension,实际上就是类似于Gradle的配置信息,在主项目使用自定义的Gradle插件时,可以在主项目的build.gradle脚本中通过Extension来传递一些配置、参数。

创建一个Extension,只需要创建一个Groovy类即可,如图所示:

这里写图片描述

如上所示,笔者命名了一个叫MyExtension的groovy类,其脚本如下所示:

package com.xys;class MyExtension {    String message}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5

MyExtension代码非常简单,就是定义了要配置的参数变量,后面笔者将具体演示如何使用。

在Groovy脚本中使用Extension

在创建了Extension之后,需要修改下之前创建的Groovy类来加载Extension,修改后的脚本如下所示:

package com.xysimport org.gradle.api.Pluginimport org.gradle.api.Projectpublic class MainPluginForBuildSrc implements Plugin<Project> {    @Override    void apply(Project project) {        project.extensions.create('pluginsrc', MyExtension)        project.task('testPlugin') << {            println project.pluginsrc.message        }    }}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

通过project.extensions.create方法,来将一个Extension配置给Gradle即可。

创建resources—3

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

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

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

这里写图片描述

如上所示,这里笔者命名为pluginsrc.properties,在该文件中,代码如下所示:

implementation-class=com.xys.MainPluginForBuildSrc
  
  
  • 1

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

在主项目中使用插件

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

apply plugin: 'pluginsrc'
  
  
  • 1
  • 2

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

配置Extension

在主项目的build.gradle文件中,通过如下所示的代码来加载Extension:

pluginsrc{    message = 'hello gradle plugin'}
  
  
  • 1
  • 2
  • 3

同样,领域名为插件名,配置的参数就是在Extension中定义的参数名。

配置完毕后,就可以在主项目中使用自定义的插件了,在终端执行gradle testPlugin指令,结果如下所示:

:app:testPluginhello gradle plugin
  
  
  • 1
  • 2

在本地Repo中使用

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

创建Android Library Module

首先,在主项目的工程中,创建一个普通的Android Library Module,并删除其默认创建的目录,修改为Gradle插件所需要的目录,即在buildSrc目录中的所有目录,如图所示:

这里写图片描述

如上图所示,创建的文件与在buildSrc目录中创建的文件都是一模一样的,只是这里在一个自定义的Module中创建插件而不是在默认的buildSrc目录中创建。

部署到本地Repo

因为是通过自定义Module来创建插件的,因此,不能让Gradle来自动完成插件的加载,需要手动进行部署,所以,需要在插件的build.gradle脚本中增加Maven的配置,脚本如下所示:

apply plugin: 'groovy'apply plugin: 'maven'dependencies {    compile gradleApi()    compile localGroovy()}repositories {    mavenCentral()}group='com.xys.plugin'version='2.0.0'uploadArchives {    repositories {        mavenDeployer {            repository(url: uri('../repo'))        }    }}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

相比buildSrc中的build.gradle脚本,这里增加了Maven的支持和uploadArchives这样一个Task,这个Task的作用就是将该Module部署到本地的repo目录下。在终端中执行gradle uploadArchives指令,将插件部署到repo目录下,如图所示:

这里写图片描述

当插件部署到本地后,就可以在主项目中引用插件了。

当插件正式发布后,可以把插件像其它module一样发布到中央库,这样就可以像使用中央库的库项目一样来使用插件了。

引用插件

在buildSrc中,系统自动帮开发者自定义的插件提供了引用支持,但自定义Module的插件中,开发者就需要自己来添加自定义插件的引用支持。在主项目的build.gradle文件中,添加如下所示的脚本:

apply plugin: 'com.xys.plugin'buildscript {    repositories {        maven {            url uri('../repo')        }    }    dependencies {        classpath 'com.xys.plugin:plugin:2.0.0'    }}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

其中,classpath指定的路径,就是类似compile引用的方式,即——插件名:group:version
配置完毕后,就可以在主项目中使用自定义的插件了,在终端执行gradle testPlugin指令,结果如下所示:

:app:testPluginHello gradle plugin
  
  
  • 1
  • 2
 

如果不使用本地Maven Repo来部署,也可以拿到生成的插件jar文件,复制到libs目录下,通过如下所示的代码来引用:

   
classpath fileTree(dir: 'libs', include: '\*.jar') // 使用jar
   
   
  • 1

参考:https://docs.gradle.org/current/userguide/custom_plugins.html

           
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值