自定义gradle插件

Posted 玉刚说

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义gradle插件相关的知识,希望对你有一定的参考价值。

通过这个内容,我们能够解释一些在平时android开发中的一些困惑

1.我们每次用到的android域从何而来?

2.为什么在android域内设置一些属性,会在项目中生效 
首先,因为用到gradle的大部分都是android开发者,我们来看一个project中的gradle脚本

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "23.0.3"
    defaultConfig {
        applicationId "cn.edu.nuc.gradletest"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    testCompile 'junit:junit:4.12'
}

这是一个标准的android项目的gradle脚本,可以看到在刚刚开始,我们引用了一个“com.android.application”插件。那这个插件是如何工作的呢?下面我们从最简单的插件开始,一步一步接近写出一个能够像application这样使用的插件

因为,编写一个插件可以用java,groovy这些应用,但建议还是使用groovy,因为毕竟人家就是用来干这个的。自然支持就好很多。 
我们编写一个插件需要考虑这些问题?

接下来我们就围绕着这些问题进行探讨

如何成为一个插件类

在jvm中如果要实现一个特定功能的类,我们的思路肯定是寻找是否存在一个接口,在文档中我们可以看到,如果我们需要自定义一个插件我们需要实现Plugin这个接口,并实现其apply方法,

for instance: 

result: 
自定义gradle插件

可以看到,我们在脚本中定义的一个插件类,然后顺便就使用了 
通过这个最简单的一步,我们可以理解到,一个项目的构建过程,我们可以在插件中全部定义(确定依赖关系),然后一旦一个项目的构建脚本中应用到这个插件就可以获得这个插件中的所有task,然后运行就ok,假如一个项目中有编译,测试,部署3步,我们模拟一下:

自定义gradle插件

自定义gradle插件

ok,我们可以看到,一个基本项目的构建就这样模拟出来了,实际情况下,我们将这些task里面填写一些逻辑就可以完成一个真实项目的插件了

插件和脚本(project)通信

如果是android开发者,大家都都知道在build,gradle中有一个android域,在这里面对android进行各种配置,因为android project的构建是由”com.android.application”这个插件进行的,使用这些配置也必须传入到这个插件中,那一个build脚本是如何将配置信息传入一个插件中的呢?

一般我们的做法都是使用一个Extension(拓展类)来存储信息并通信的

for instance: 
自定义gradle插件

result: 
自定义gradle插件

可以看到,我们通过创建一个拓展类的变量去传递信息.插件中打印出字符串是脚本中我们自己去设置的,这就极大的增加了一个插件的灵活性。

可能大家感觉这个和我们构建android的脚本有些不一样,所以我们就来模拟一个类似android项目的插件

自定义gradle插件

自定义gradle插件

如何,是不是感觉gradle不再神秘,一个android插件也就那么回事 
我们一直都是在脚本中直接定义插件,这种做法非常不灵活,使我们的插件不能很多的应用到多个项目中,接下来就让我们继续探索,如何插件一个灵活的插件

如建立一个插件项目

首先我们需要建立一个项目的目录 
项目的结构如下:

自定义gradle插件 
这里需要注意一点就行,resources里面的那个配置文件的,文件名就是你这个插件的id(唯一标识符),我们之后 apply plugin: ‘XXX’就需要这个ID

建立好这个目录后,我们开始码代码了,可以看到这里面有四个文件需要我们写 
1.插件类 
自定义gradle插件 
2.将ID和插件类对应 
自定义gradle插件 
3.这个项目的初始化 
自定义gradle插件 
4.项目的构建 
自定义gradle插件 
可以看到主要的工作还是在build.gradle中实现的

1.引用了2个插件 ‘groovy’和’maven’

2.然后定义了编译时候的依赖

compile gradleApi()
compile localGroovy()

3.指定了group和version唯一确定这个插件

4.指定仓库以及上传仓库的路径

ok,这样一个插件就搞定了,然后我们运行什么任务呢 
如果不清楚的话,可以使用

gradle tasks

查看之后应该是执行 Upload task

执行 gradle task 发现

自定义gradle插件 
在这个项目的同级目录下多出一个目录文件,里面包含着我们的一些jar和pom

然后我们就可以开始进行应用这个插件了,我们在同级目录下创建一个项目

然后coding build.gradle 
自定义gradle插件

在这里我们主要是指定了仓库和插件的项目,然后apply了这个插件

这里说下指定项目时应该是 Group:projectName:Version的格式

我们运行一下这个项目

可以看到我们已经成功应用插件了

android插件是怎样的?

最后我们可以看下android的插件是怎么样的?

首先我们可以看到id和插件类的对应关系

自定义gradle插件 
然后我们看下插件类的结构,大体就是分为插件类和拓展类,然后都有一个base类 

最后看下我们的android域是如何创建的,和我们前面的插件方法是一样的 

ok.相信到这里大家对自定义gradle插件以及android中的gradle脚本应该非常清楚

    • 一个类如何才能成为一个插件类

    • 一个插件类如何能和project进行通信(数据传输)

    • 一个脚本如何能够灵活使用咱们的插件类

以上是关于自定义gradle插件的主要内容,如果未能解决你的问题,请参考以下文章

Android Gradle 插件自定义 Gradle 任务 ④ ( Task#doLast 函数用法 | 自定义 Gradle 任务代码示例 )

Android Gradle 插件自定义 Gradle 任务 ④ ( Task#doLast 函数用法 | 自定义 Gradle 任务代码示例 )

Android Gradle 插件Gradle 自定义 Plugin 插件 ② ( buildSrc 目录中实现 Gradle 插件 | 实现 Gradle 插件代码 | 模块引入插件并编译 )

Android Gradle 插件Gradle 自定义 Plugin 插件 ⑥ ( 在 buildSrc 模块中依赖 Android Gradle 插件 | 完整代码示例 )

Android Gradle 插件Gradle 自定义 Plugin 插件 ⑥ ( 在 buildSrc 模块中依赖 Android Gradle 插件 | 完整代码示例 )

VSCode插件开发全攻略代码片段设置自定义欢迎页