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 www.sb45475.com 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.www.yuheng119.com spi.demo.gradle.DemoPlugin
1
1
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.gradle和com.gradleware不能被使用
不能以“.”字符开始或者结束
不能连续使用“.”字符
尽管插件id和Java包名有些相似,但实际上包名比插件id要详细得多。

4.3 发布插件

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

例如:

compile 'com.android.support:appcompat-v7:25.3.1'
1
1
这个引用中

com.android.support是groupId
appcompat-v7是artifactId
25.3.1是version。
同样,在发布插件时候,也需要这三个属性,用于和其他插件做出区分。

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

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

dependencies {
compile gradleApi()
compile www.lieqibiji.com localGroovy()
}

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

uploadArchives {
repositories {
mavenDeployer {
repository(url: uri('../repo'))
}
}
在这里,定义了group和version,但是没有定义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.www.jpg521.com spi.www.wmyl11.com/demo:plugin:1.0-SNAPSHOT'
}
添加了构建的依赖库路径,配置了依赖的具体插件名称。然后在任务列表中就可以看见名为hello的任务。

图-4 引入插件任务图
使用gradle -q hello指令输出如下:

> gradle -q hello
Hello World from the DemoPlugin

5. 总结

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

发布到lvy仓库的教程参考点击进入详情
发布到maven仓库的教程参考点击进入详情
发布到Gradle plugin portal教程参考点击进入详情,想要搜索Gradle plugin portal中有哪些插件,查看这里点击进入详情

转载于:https://www.cnblogs.com/chenergougou/p/7092825.html

自定义Gradle Plugin相关推荐

  1. AS 自定义 Gradle plugin 插件 案例 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. Android Studio 自定义Gradle Plugin

    一.简介 之前公司的一个项目需要用到Gradle插件来修改编译后的class文件,今天有时间就拿出来整理一下,学习一下Gradle插件的编写还是一件十分有意义的事. 二.Gradle插件类型 一种是直 ...

  3. 使用AndroidStudio创建自定义gradle插件并被引用实战例子

    项目中引入自定义Gradle plugin一般有三种方法: 直接写在 build.gradle中. plugin源码放到rootProjectDir/buildSrc/src/main/groovy目 ...

  4. 【错误记录】自定义 Gradle 插件报错 ( Could not find implementation class x for plugin x specified in jar:file )

    文章目录 一.报错信息 二.解决方案 一.报错信息 参考 [Android Gradle 插件]自定义 Gradle 插件模块 ④ ( META-INF 中声明自定义插件的核心类 | 在应用中依赖本地 ...

  5. 继往开来:Google I/O 21 Android Gradle Plugin 更新总结

    距离 Google I/O 2021 已经过去了将近一个月,最近几天捋了捋关于 Android Gradle Plugin(AGP)方面的东西,主要集中在 "What's new in An ...

  6. Android如何自定义Gradle插件

    Android-如何自定义gradle插件 自定义gradle插件可以实现定制自己的构建流程,以达到复用目的: ##1. 自定义插件方式 自定义插件有三种方式 添加脚步 在你的app项目的build. ...

  7. Android组件化开发实践(九):自定义Gradle插件

    本文紧接着前一章Android组件化开发实践(八):组件生命周期如何实现自动注册管理,主要讲解怎么通过自定义插件来实现组件生命周期的自动注册管理. 1. 采用groovy创建插件 新建一个Java L ...

  8. 【Android 修炼手册】Gradle 篇 -- Android Gradle Plugin 主要流程分析

    预备知识 理解 gradle 的基本开发 了解 gradle task 和 plugin 使用及开发 了解 android gradle plugin 的使用 看完本文可以达到什么程度 了解 andr ...

  9. 创建第一个适用于Android的自定义Gradle插件-第2部分:在构建时生成资源

    A hands on tutorial to get started with adding custom functionality to your Android builds using Kot ...

最新文章

  1. 美国的机器人军团要来了吗?
  2. golang获取当前正规时间
  3. 4.Hibernate O/R 映射
  4. 28.构造函数中,成员变量一定要通过初始化列表来初始化的?
  5. core-js@2 core-js@3报错问题
  6. 北理工计算机学院新闻,北理工计算机学子勇夺CVPR 2021 AI安全国际顶级赛事季军...
  7. mybatisplus 结果_SpringBoot + MyBatisPlus 快速入门
  8. python 文件操作练习
  9. c语言编写的商品管理程序,C语言编写的商品管理系统
  10. 区块链共识问题都有什么?
  11. matlab设置ga算法,matlab遗传算法ga函数
  12. 基于springboot的疫情社区管理系统
  13. 2021 年“认证杯”数学中国数学建模网络挑战赛 B题解题思路
  14. java植物大战僵尸,我家ADC直呼内行,甚至喊出辅助牛逼、666
  15. java语言中cpu数据_重塑云上的 Java 语言
  16. 黑客必会之——Windows入侵痕迹清理--你学会了吗?
  17. 【实用教程】本地blast使用及简单python脚本辅助
  18. “adb”不是内部或外部命令,也不是可运行的程序或批处理文件
  19. 2018年广东工业大学文远知行杯新生程序设计竞赛 1007 活在无尽梦境的后续 β
  20. 树与二叉树转换,森林与二叉树的转换,哈夫曼编码例题详解

热门文章

  1. Tab选项卡切换效果JavaScript汇总
  2. Unable to load configuration的解决方法
  3. Spring| BeanCurrentlyInCreationException: Error creating bean with name ‘‘xxx“
  4. 【C#】C#实现鼠标滚轮的图像居中缩放
  5. nlp论文-《Neural Machine Translation by Jointly Learning to Align and Translate》-基于联合学习对齐和翻译的神经机器翻译(二)
  6. C++字符串转化为数字的库函数
  7. Failed to issue method call Unit mysql service failed to lo
  8. 【架构师】【数据库基础】【笔记 01】快速了解数据库系统的重要概念01
  9. 【环境搭建005】UBUNTU13.04 android4.08 源码编译实践中遇到的问题
  10. vim剪切指定行_10 分钟上手 Vim,常用命令大盘点