Gradle常见插件开发方式

Gradle作为项目的构建方式,起着很重要的作用,而我们在开发中却基本很少深入的了解它,这篇文章就记录下在学习插件开发过程的笔记。插件开发的基础是task,对于task的学习,可以看任玉刚的这篇文章,基本的使用介绍得很清楚。

Gradle插件分为脚本插件对象插件,下面来分别看下两者的使用

脚本插件

脚本插件就是在普通的gradle中写一系列task,然后在别的gradle构建脚本中通过 apply from: 'xx.gradle' 引用这个脚本插件

Gradle常见插件开发方式_第1张图片
首先在根目录中创建config.gradle文件,在里面定义好一个task

project.task("showConfig") {
    doLast {
        println("$project.name:showConfig")
    }
}

然后我们在项目的gradle中引入

apply from: 'config.gradle'

接着就可以通过gradlew执行这个task了

gradlew showconfig

运行结果

> Task :showConfig 
GradleDemo:showConfig

对象插件

对象插件是指实现了org.gradle.api.Plugin接口的类。并且需要实现void apply(T target)这个方法,该方法中的泛型指的是此Plugin可以应用到的对象,而我们通常是将其应用到Project对象上。

编写对象插件常见创建方式
1 .直接在gradle脚本文件中
2 .在buildSrc目录下
3 .在独立的项目下

gradle中直接创建

gradle里面创建比较简单,直接实现类接口

//app.gradle
class CustomPluginInBuildGradle implements Plugin<Project> {
    @Override
    void apply(Project target) {
       target.task('showCustomPluginInBuildGradle'){
            doLast {
                println("task in CustomPluginInBuildGradle")
            }
        }
    }
}

然后通过插件类名引用它

//app.gradle
apply plugin: CustomPluginInBuildGradle

接着就可以直接执行这个task了

运行结果

> Task :app:showCustomPluginInBuildGradle 
task in CustomPluginInBuildGradle

buildSrc目录中创建

buildSrc目录是Gradle在项目中配置自定义插件的默认目录,里面定义的task可以直接使用,首先我们需要创建一个Java Library Module,名字叫buildSrc,因为使用的groovy,所以目录下面的java需要修改为groovy,需要通过id符号引入的,也需要创建resources->META-INF->gradle-plugins

修改之后的目录结构

Gradle常见插件开发方式_第2张图片
CustomPluginInBuildSrc是定义好的对象插件,resources中定义的内容是为了通过id识别的

package com.gary.plugin

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

class CustomPluginInBuildSrc implements Plugin<Project> {
    @Override
    void apply(Project project) {
        project.task('showCustomPluginInBuildSrc') {
            doLast {
                println('task in CustomPluginInBuildSrc')
            }
        }
    }
}

tip: 有时候可能不会自动导包,需要手动导入,package也别忘了,否则就会报一些奇怪的错误。

接着看下resources里面的myplugin.properties

implementation-class=com.gary.plugin.CustomPluginInBuildSrc

这其中myplugin是别的gradle构建脚本识别的id,implementation-class需要设置的是全路径名,当然resources目录里面的内容可以不用创建,我们在别的构建脚本中导入的时候,就需要导入全路径名

apply plugin: 'myplugin'

导入之后我们就可以使用buildSrc里面的task了

运行结果

> Task :app:showCustomPluginInBuildSrc 
task in CustomPluginInBuildSrc

在buildSrc里面定义的task就可以在不同module中使用,但是不适合在不同project中使用了

在独立的项目中创建

在独立项目中创建和buildSrc中创建是一样的,只不过要使用的话,这个项目需要打包上传,然后在别的项目中引入,这里测试的话,就上传到本地目录中了,上传首先要引入Maven,配置代码如下

apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
    compile gradleApi()
    compile localGroovy()
}
group = 'com.gary.plugin'
version = '1.0.0'
uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: uri('../repo'))
        }
    }
}

接着点击这里

Gradle常见插件开发方式_第3张图片
接着就会打包项目,上传到项目根目录repo中,上传结果

Gradle常见插件开发方式_第4张图片
在项目中就可以通过group:artifact:version方式引入了

buildscript {
    //https://docs.gradle.org/current/userguide/custom_plugins.html
    repositories {
        maven {
            url uri('repo')
        }
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.1'
        classpath 'com.gary.plugin:alonemyplugin:1.0.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

然后在module的gradle中引入

apply plugin: 'alonemyplugin'

最后就可以使用在项目中定义的task了。

运行结果

> Task :app:showStandAlonePlugin 
task in StandAlonePlugin

总结

1 . 插件分为脚本插件和对象插件。
2 . 脚本插件通过apply from: 'foo.gradle’引用。
3 . 对象插件可以在当前构建脚本下直接编写,也可以在buildSrc目录下编写,还可以在完全独立的项目中编写,通过插件类名或是id引用。apply plugin: ClassName或者apply plugin:‘pluginid’

参考

1 . 一篇文章带你了解Gradle插件的所有创建方式
2 . 全面理解Gradle - 定义Task

你可能感兴趣的:(android)