12

Gradle自定义插件

 3 years ago
source link: https://blog.csdn.net/eclipsexys/article/details/50973205
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

其中,除了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()
}

创建Groovy脚本—2

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

这里写图片描述

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

package com.xys

import org.gradle.api.Plugin
import org.gradle.api.Project

public class MainPluginForBuildSrc implements Plugin<Project> {

    @Override
    void apply(Project project) {
        project.task('testPlugin') << {
            println "Hello gradle plugin in src"
        }
    }
}

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

创建Groovy脚本的Extension

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

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

这里写图片描述

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

package com.xys;

class MyExtension {
    String message
}

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

在Groovy脚本中使用Extension

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

package com.xys

import org.gradle.api.Plugin
import org.gradle.api.Project

public class MainPluginForBuildSrc implements Plugin<Project> {

    @Override
    void apply(Project project) {

        project.extensions.create('pluginsrc', MyExtension)

        project.task('testPlugin') << {
            println project.pluginsrc.message
        }
    }
}

通过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

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

在主项目中使用插件

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

apply plugin: 'pluginsrc'

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

配置Extension

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

pluginsrc{
    message = 'hello gradle plugin'
}

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

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

:app:testPlugin
hello gradle plugin

在本地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'))
        }
    }
}

相比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'
    }
}

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

:app:testPlugin
Hello gradle plugin

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

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK