Gradle自定义插件

Gradle自定义插件

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

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

开发Gradle插件能够在IDEA中进行开发,也能够在Android Studio中进行开发,它们惟一的不一样,就是IDEA提供了Gradle开发的插件,比较方便建立文件和目录,而Android Studio中,开发者须要手动建立(但实际上,这些目录并很少,也不复杂,彻底能够手动建立)。java

在项目中使用

在Android Studio中建立一个标准的Android项目,整个目录结构以下所示: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两个目录。api

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

建立buildSrc/build.gradle—1

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

apply plugin: 'groovy'

dependencies { compile gradleApi() compile localGroovy() }

建立Groovy脚本—2

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

这里写图片描述

在脚本中经过实现gradle的Plugin接口,实现apply方法便可,脚本以下所示:maven

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,会输出一行日志。ide

建立Groovy脚本的Extension

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

建立一个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

相关文章
相关标签/搜索