gradle自定义插件

gradle自定义插件实现

Gradle插件实现的基本情况共有三种:

插件实现方式解释说明
buildScript脚本把插件写在build.gradle文件中,一般用于简单的逻辑,只在该build.grade文件可见
buildSrc目录将插件源代码放在buildSrc/src/main中,只对该项目可见
独立项目个独立的Java项目/模块,可以将文件包发布到仓库(Jecenter,Maven),使其他项目方便引入

下面分别对三种方式一一说明:

1、build script 脚本

这种方式实现的插件只有build.gradle文件可见,例如在app的build.gradle中,插件名PluginDemo实现方式:

apply plugin: PluginDemo //引入插件

//定义插件
class PluginDemo implements Plugin<Project> {

		@Override
		void apply(Project project) {
		println '第一种方式实现插件'
	}
}

执行结果
在这里插入图片描述

2、buildSrc目录

这种方式创建的Module是一个独特的,AndroidStudio会自动识别buildSrc插件模块

首先,在项目的根目录下创建一个buildSrc文件夹,然后在buildSrc文件夹里创建一个build.gradle文件,build.gradle文件代码如下:

apply plugin: "java"
apply plugin: 'java-gradle-plugin'

然后,点击Sync同步项目,就会发现buildSrc文件夹下会多出一些gradle的相关文件,截图如下:
在这里插入图片描述

接下来在buildSrc上右键新建文件夹,会发现多出一些文件夹选择,如下:

在这里插入图片描述
选择Java文件夹,在其下面创建一个MyPlugin.java文件, 截图如下:

在这里插入图片描述

// MyPlugin.java

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

class MyPlugin implements Plugin<Project> {
		@Override
		public void apply(Project target) {
		System.out.println("第二种实现插件方式 buildSrc 实现插件");
	}
}


还是一样在App模块的build.gradle中加入如下代码

apply plugin: MyPlugin

运行结果如下:
在这里插入图片描述

3、通过Module/Library自定义插件

在这里插入图片描述
如果是通过Android Library自定义插件的话,该module下的build.gradle生成的内容并不需要,全部删除,新加上 Gradle 插件开发需要的 Gradle 插件、依赖等。

plugins {
    id 'java-library'
    id 'groovy' // 应用 'groovy' 插件是因为我们的项目是使用 Groovy 语言开发的
}


java {
    sourceCompatibility = JavaVersion.VERSION_1_7
    targetCompatibility = JavaVersion.VERSION_1_7
}

plugins {
    id 'java-library'
    id 'groovy' // 应用 'groovy' 插件是因为我们的项目是使用 Groovy 语言开发的
}


java {
    sourceCompatibility = JavaVersion.VERSION_1_7
    targetCompatibility = JavaVersion.VERSION_1_7
}

apply plugin: 'maven-publish' // 发布到maven仓库需要的插件

// 后面发布仓库的时候添加
//publishing {
//    publications {
//        MyPlugin(MavenPublication) {
//            from components.java
//            groupId 'com.example.mylibrary' // 唯一标识(通常为模块包名,也可以任意)
//            artifactId 'plugin' // 项目名称(通常为类库模块名称,也可以任意)
//            version '1.0.0' // 版本号
//        }
//    }
//}

3.1 新建一个Library

比如说新建一个Android Library

3.2 创建resources/META-INF/gradle-plugins/XXXX.properties文件

其中,resources 和Java同级,resources 可以通过在main文件夹右键提示创建。resources 文件夹下是固定格式的 META-INF/gradle-plugins/XXXX.properties,必须是这个路径,XXXX 就代表以后使用插件时需要指定的 plugin id。

比方说创建com.example.plugins.properties ,以后使用插件的时候,插件的id必须是
com.example.plugins

apply plugin: 'com.example.plugins'

创建图片如下:
在这里插入图片描述

说明一下com.example.plugins.properties文件的含义:

文件名com.example.plugins就是我们项目中要引入的插件的名称,插件名称可以自定义。.properties文件的内容要填什么?就是从入口找到的插件类。

示例代码:

com.example.plugins.properties

/*
Gradle 插件并不会自动寻找入口类,而是要求开发者把入口类的类名写在
resources/META-INF/gradle-plugins/XXXX.properties 里,
内容格式为 “implementation-class=入口类的全限定名”
*/
implementation-class =com.example.mylibrary.MyPlugin
package com.example.mylibrary;

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

//Project 和 Plugin 都是在这个包 org.gradle.api下的

class MyPlugin implements Plugin<Project> {
    @Override
    public void apply(Project target) {
        System.out.println("第三种实现 自定插件方式");
    }
}


3.3 发布到仓库(这里弄到本地仓库,不弄到远程仓库了)

在插件的build.gradle再添加如下脚本,这里需要发布,后面才可以使用。

apply plugin: 'maven-publish' // 发布到maven仓库需要的插件

publishing {
    publications {
        MyPlugin(MavenPublication) {
            from components.java
            groupId 'com.android' // 唯一标识(通常为模块包名,也可以任意)
            artifactId 'plugin' // 项目名称(通常为类库模块名称,也可以任意)
            version '1.0.0' // 版本号
        }
    }
}

// gradle旧版发布方式
//uploadArchives{
//    repositories.mavenDeployer {
//        //本地仓库路径,以放到项目根目录下的 repo 的文件夹为例
//        repository(url: uri('../repo'))
//        //groupId ,自行定义
//        pom.groupId = 'com.android'
//        //artifactId
//        pom.artifactId = 'plugin'
//        //插件版本号
//        pom.version = '1.0.0'
//    }
//}

3.4 点击task发布

单击 rebuild,进行编译,之后点击右侧菜单栏在打开Gadle
在这里插入图片描述
双击3的位置,进行本地发布,完了以后这个插件就可以使用了;

3.5 引入插件到工程

在主工程的build.gradle文件中添加如下:

buildscript {
    repositories {
        mavenLocal() //默认路径在C:/Users/用户名/.m2/repository下面,(本机电脑)

        // 如果是发布到指定的目录,声明的时候要显示声明路径
//        maven{
//            // 刚刚我们把插件发布到了根目录下面的 repo 文件夹
//            url 'repo'
//        }
    }
    dependencies {
        classpath 'com.android:plugin:1.0.0'//引入插件
    }
}

3.6 使用插进

在app项目的build.gradle中添加

apply plugin: 'com.example.plugins'

3.7 运行代码

在这里插入图片描述
打印说明,自定义插件成功实现。

as gradle插件开发不友好的地方

目前 Android Studio 对于 Gradle 插件开发的支持不够好,很多 IDE 本可以完成的工作都需要我们手动完成,例如

  1. Android Studio 不能够直接新建 Gradle 插件的 Module,只能先新建一个 Java Library 类型的 Module,再把多余的文件夹删除;

  2. 新建类默认是新建 Java 的类,新建的文件名后缀是 “.java”,想要新建 Groovy 语法的类需要手动新建一个后缀为 “.groovy” 的文件,然后添加上 package、class 声明;

  3. resources 整个都需要手动创建,文件夹名需要注意拼写;

  4. 删除掉 Module 的 build.gradle 全部内容,新加上 Gradle 插件开发需要的 Gradle 插件、依赖等

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值