自定义Gradle Plugin

原创 2017年06月28日 15:35:15

转载注明出处:http://blog.csdn.net/xiaohanluo/article/details/73848633

1. 前言

自定义Gradle Plugin使用的是Groovy语言,和Java很像,很容易理解,不做过多的语言介绍。

2. Gradle Plugin的位置

  • 直接在构建文件build.gradle中编写Plugin,这种方法写的Plugin无法被其他构建文件引用
  • 单独写Gradle Plugin文件,放在rootProjectDir/buildSrc/src/main/groovy/目录下,同一个工程中所有的构建文件够可以引用这个插件,但是不能被其他工程引用
  • 单独的工程中自定义Gradle Plugin,上传到远端maven库等,其他工程通过添加依赖,引用这个插件

3. 简单的Gradle Plugin示例

自定义插件,需要实现Plugin接口。在其他工程的构建文件中通过Plugin.apply(T)方法引用插件,这个工程会被当作参数传入。上面讲了Gradle Plugin可能存在的三种位置,下面是一个简单插件的示例,是直接写在build.gradle的。

apply plugin: DemoPlugin

// 其他一些工程的配置信息
...

class DemoPlugin implements Plugin<Project> {
    void apply(Project project) {
        project.task('hello') {
            doLast {
                println "Hello World from the DemoPlugin"
            }
        }
    }
}

使用gradle -q hello指令输出如下:

> gradle -q hello
Hello World from the DemoPlugin

因为这个Gradle Plugin是直接写在构建文件build.gradle里的,所以它不能被其他构建文件引用,下面介绍可被其他工程引用的自定义插件。

4. 自定义插件

想要可以被其他工程引用我们自定义的Gradle Plugin,需要将Gradle Plugin上传到maven等远端库,因为是demo,就将插件发布到本地。一般来说有下面几步。

  • rootProjectDir/buildSrc/src/main/groovy/目录下创建插件,并实现具体内容
  • rootProjectDir/buildSrc/src/main/resources/META-INF/gradle-plugins目录下创建属性文件声明插件的具体实现类,属性文件的名称和Gradle Plugin Id相匹配,内容是implementation-class=具体实现类全称
  • 上传mavan等库,这篇文章就不上传到maven库,将插件发布到本地
  • 其他工程引用插件

4.1 插件具体实现类

目录结构如下:


图-1 插件目录结构图

插件类具体内容如下:

package com.spi.demo.gradle

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

public class DemoPlugin implements Plugin<Project> {
    void apply(Project project) {
        project.task('hello') {
            doLast {
                println "Hello World from the DemoPlugin"
            }
        }
    }
}

可以看出其实和Java文件差别不大,这个插件主要申明了一个名为hello的任务,这个任务只输出一句话。

实现了Gradle Plugin的具体实现类后,在/buildSrc/src/main/resources/目录下创建属性文件声明Gradle Plugin的具体实现类的位置。属性文件的名称是.propertires,内容是具体实现类的位置,这个demo中属性文件的内容如下:

implementation-class=com.spi.demo.gradle.DemoPlugin

4.2 插件Id

插件Id是自定义的,声明插件Id后,其他工程在构建文件build.gradle中通过apply plugin: 'Plugin Id'来引用具体的Gradle Plugin。

插件id类似于java中的包名,可以避免与其他插件发生冲突。

插件id最好是组件命名空间和插件名称的结合,例如,如果有一个名为“foo”的Github账户,他插件被命名为“bar”,插件id可以是com.github.foo.bar。同样,如果一个叫做baz的插件开发组织,插件id可以是org.baz.bar插件。

插件id遵从一下规则:

  • 可以包含任何字母和数字,以及“.”和“-”字符
  • 必须包含至少一个“.”字符
  • 只能使用小写字母
  • org.gradlecom.gradleware不能被使用
  • 不能以“.”字符开始或者结束
  • 不能连续使用“.”字符

尽管插件id和Java包名有些相似,但实际上包名比插件id要详细得多。

4.3 发布插件

在gradle文件或者pom文件引入一个库,需要有groupId、artifactId、version三个属性,根据这三个属性来区分找到唯一的库。

例如:

compile 'com.android.support:appcompat-v7:25.3.1'

这个引用中

  • com.android.supportgroupId
  • appcompat-v7artifactId
  • 25.3.1version

同样,在发布插件时候,也需要这三个属性,用于和其他插件做出区分。

build.gradle文件内容如下,添加上传任务:

apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'maven'

dependencies {
    compile gradleApi()
    compile localGroovy()
}

group = 'com.spi.demo'
version = '1.0-SNAPSHOT'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: uri('../repo'))
        }
    }
}

在这里,定义了groupversion,但是没有定义artifact,这是因为artifact默认是这个工程目录名称,这个demo中artifact就是plugin

uploadArchives任务中,我们将插件发布到本工程的上一层目录的repo文件夹中。执行这个任务后,插件会被发布,发布后目录结构如下图。


图-2 本地插件目录结构图

可以直接在终端使用指令执行uploadArchives任务,可以将plugin目录工程设置成module,使用Android Studio执行任务。


图-3 上传插件任务图

4.4 引用插件

在工程的构建文件build.gradle中添加依赖,引用插件。

apply plugin: 'com.spi.demo'

buildscript {
    repositories {
        maven {
            url uri('../repo')
        }
    }
    dependencies {
        classpath 'com.spi.demo:plugin:1.0-SNAPSHOT'
    }
}

添加了构建的依赖库路径,配置了依赖的具体插件名称。然后在任务列表中就可以看见名为hello的任务。


图-4 引入插件任务图

使用gradle -q hello指令输出如下:

> gradle -q hello
Hello World from the DemoPlugin

5. 总结

本文没有讲解将插件发布到远端,插件可以发布到lvy仓库、maven仓库、Gradle plugin portal三个地方。

版权声明:本文为博主原创文章,未经博主允许不得转载。

[开源学习_MeiZhi]使用config.gradle统一管理项目的依赖库

[开源学习]使用config.gradle统一管理项目的依赖库源码片段来源: drakeet的MeiZi 项目. https://github.com/drakeet/Meizhi如何配置新建con...
  • maxwell0401
  • maxwell0401
  • 2016年08月06日 09:50
  • 2478

Gradle系列教程之依赖管理

这一章我将介绍Gradle对依赖管理的强大支持,学习依赖分组和定位不同类型仓库。依赖管理看起来很容易,但是当出现依赖解析冲突时就会很棘手,复杂的依赖关系可能导致构建中依赖一个库的多个版本。Gradle...
  • meegomeego
  • meegomeego
  • 2015年10月16日 11:59
  • 3422

自定义Gradle插件(一)

Google已经建议Android开发全部转向Android Studio开发,Android Studio 是使用gradle编译、打包的,那么问题来了,gradle可是有一堆东西...,为了测底了...
  • liuhongwei123888
  • liuhongwei123888
  • 2016年01月19日 13:35
  • 10381

在AndroidStudio中自定义Gradle插件

一直都想好好学习AndroidStudio中的gradle,总感觉不懂如何在AndroidStudio中自定义gradle插件的程序员就不是个好程序员,这次上网查了一下相关资料,做了一个总结~...
  • huachao1001
  • huachao1001
  • 2016年07月02日 14:17
  • 8676

使用AndroidStudio自定义Gradle插件

使用AndroidStudio自定义Gradle插件1.概述目标:编写一个Gradle插件,学习自定义Gradle插件。 功能:利用lint自动删除无用资源。 实现思路:先执行lint任务,通过解析生...
  • u012951554
  • u012951554
  • 2017年06月15日 15:45
  • 438

使用AndroidStudio自定义Gradle插件

使用AndroidStudio自定义Gradle插件1.概述目标:编写一个Gradle插件,学习自定义Gradle插件。 功能:利用lint自动删除无用资源。 实现思路:先执行lint任务,通过解析生...
  • u012951554
  • u012951554
  • 2017年06月15日 15:45
  • 438

Gradle学习系列之十——自定义Plugin

在本系列的上篇文章中,我们讲到了如何自定义Task类型,在本篇文章中,我们将讲到如何自定义Plugin。     请通过以下方式下载本系列文章的Github示例代码: git clone h...
  • Guofengpu
  • Guofengpu
  • 2016年05月20日 11:23
  • 294

Gradle自定义Plugin(上)

这篇文章讲给大家带来gradle打包系列中的高级用法-自己动手编写gradle插件。我们平常在做安卓开发时,都会在android这个插件提供的功能内使用,大部分情况下,配置好这个插件就够了,但是有时候...
  • birthmarkqiqi
  • birthmarkqiqi
  • 2016年10月19日 15:49
  • 3244

自定义gradle插件

前言:还记得前期做过一个android热修复的东西,其中有一个很重要的步骤就是通过javassist对jar进行字节码修改。当初修改字节码使用的是一个jar包。今天将为修改字节码这一步骤定义成一个gr...
  • killer991684069
  • killer991684069
  • 2016年06月28日 15:44
  • 1266

Android Gradle Plugin指南(三)——依赖关系、android库和多项目配置

原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Dependencies-Android-Librari...
  • qinxiandiqi
  • qinxiandiqi
  • 2014年07月14日 12:17
  • 10515
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自定义Gradle Plugin
举报原因:
原因补充:

(最多只允许输入30个字)