Gradle 实现自定义插件

一、以库项目形式创建插件

1.创建项目

如果仅仅是自己项目中来自定义插件,不对外发布,那么可以按照以下的语法来构建目录

1.1  创建一个Module,选择Java Library项目,项目名称必须是 buildSrc,否则插件不被识别

1.2 构建目录 buildSrc/src/main/groovy 本路径android studio会自动识别为 groovy类。 
1.3、在main目录中再构建 resources/META-INF/gradle-plugins,这个目录是groovy项目的资源文件目录。 

 

注意,插件的代码可以是java实现,编程方式比较繁琐,这里我们使用groovy语言。

2、代码实现
新建groovy文件 CustomPluginTest.groovy,代码如下

package com.ncf.plgimport org.gradle.api.Pluginimport org.gradle.api.Projectclass  CustomPluginTest  implements  Plugin<Project>{    @Override
    void apply(Project project) {        //增加闭包名称,闭包为customPlugin,是 CustomPluginTestExtension类型,因此CustomPluginTestExtension类型中的JaveBean类型的属性可以任意设置
        project.extensions.add("personInfo",PersonInfo)  //personInfo用于build.gradle中添加配置块
        project.task("showPersonInfo") << {            if(project.personInfo==null) return ;
            println("姓名:" + project.personInfo.name)
            println("年龄:" + project.personInfo.age)
            println("地址:" + project.personInfo.address)
        }
        project.extensions.add("bookInfo",BookInfo);
        project.task("showBookInfo",dependsOn:"showPersonInfo" ) << {  
         //注意,showBookInfo依赖showPersonInfo,dependsOn:"showPersonInfo"
            def book =  project.extensions.findByType(BookInfo);
            println("喜欢的书籍:" + book.name + ", " + book.id + ", " + book.price+'元'+','+book.address+","+book.isbn);
        }

    }
}

PersonInfo类

package com.ncf.plgclass PersonInfo {
    def name = "init";
    def age = "init";
    def address = "init";}

BookInfo类

package  com.ncf.plgclass BookInfo {
    def name = "《红楼们》";
    def isbn = "SW.SH.CN.I.20181227";
    def address = "北京市海淀区西北旺";
    def price = 25.9f
    def id = 'BS1001029'}

buildSrc 中的 build.gradle的定义,引入groovy插件,并依赖 gradleApi()、localGroovy()。

apply plugin:'groovy'  #必须group='com.ncf.plg'
version='3.0.0'

dependencies { 
    implementation gradleApi() #必须
    implementation localGroovy() #必须
    implementation fileTree(dir: 'libs', include: ['*.jar'])
}
repositories {
    mavenCentral() #必须}


sourceCompatibility = "1.7"targetCompatibility = "1.7"

配置MyCustomPlugin.properties

implementation-class=com.ncf.plg.CustomPluginTest

 

3、使用插件

在app项目的build.gradle中,我们引用插件

import com.ncf.plg.PersonInfo 


apply plugin: 'MyCustomPlugin'  //properties的名称personInfo{
    name='张三'
    age=25
    address='北京市海淀区朝阳路'}

4、调用任务

执行如下命令

gradle showBookInfo 【如果是windows系统,调用gradlew showBookInfo】

执行结果如下

> Configure project :app> Task :app:showPersonInfo姓名:张三
年龄:25
地址:北京市海淀区朝阳路

> Task :app:showBookInfo喜欢的书籍:《红楼们》, BS1001029, 25.9元,北京市海淀区西北旺,SW.SH.CN.I.20181227


猜你喜欢

转载自blog.51cto.com/14009535/2336123