Gradle插件入门

  • 实现

          Gradle中插件可以分为两类:脚本插件和对象插件。

          脚本插件: 脚本插件就是一个普通的gradle构建脚本,比如a.gradle 在a.gradle脚本中定义一系列的task。另一个构建脚本b.gradle通过apply from:'a.gradle'即可引用这个脚本插件。脚本插件: 脚本插件就是一个普通的gradle构建脚本,比如a.gradle 在a.gradle脚本中定义一系列的task。另一个构建脚                    本b.gradle通过apply from:'a.gradle'即可引用这个脚本插件。

          对象插件:是指实现了org.gradle.api.Plugin接口的类,实现Plugin接口的apply(T target)这个方法。

                    编写对象插件主要有三种方式:

                                        1.直接在gradle脚本文件中

                                        2.在buildSrc目录下

                                        3.在独立的项目下

              推荐一个说的比较简单明白的博客: https://www.jianshu.com/p/5b99e3af4d6b

              这个博客的问题是只介绍到 把插件上传到本地仓库。

              我们 使用的打点神策的插件 'com.sensorsdata.analytics.android', 上传到了https://dl.bintray.com/zouyuhan/maven的

com.sensorsdata.analytics.android:android-gradle-plugin2:2.0.1路径下。

              我们发布到Jcenter仓库

 上传一个例子,插件的主要结构

编写 对象插件

package cn.test.gradle

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

public class PluginImpl implements Plugin<Project> {
    void apply(Project project) {
        project.gradle.addListener(new TimeListener())
    }
}

resources/META-INF/gradle-plugins目录下的 yd.test.plugin.properties , 前面的 yd.test.plugin就是我们 

apply plugin: 'yd.test.plugin'  的这个部分的名字来源。

 build.gradle文件内容全部删除之后添加上

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

dependencies {
    compile gradleApi()
    compile localGroovy()
}

repositories {
    mavenCentral()
}

group='cn.test.gradle'
version='4.0.0'
使用插件的时候 classpath 'cn.test.gradle:plugintest:4.0.0' 中 n.test.gradle是group ,plugintest是artifactId即module名,4.0.0是版本。 

在项目根目录下的build.gradle文件 buildscript 中加入 

dependencies {
        classpath 'com.android.tools.build:gradle:3.1.4'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'
        classpath 'com.github.dcendents:android-maven-plugin:1.2'
    }

在项目根路径下新建bintray.gradle文件。 添加下面的内容

apply plugin: 'com.jfrog.bintray'
apply plugin: 'maven-publish'

def projectName = "testplugin"
def mavenDesc = 'yangdan desc'
def baseUrl = 'https://github.com/hellocat99'
def siteUrl = baseUrl
def gitUrl = "${baseUrl}/yourGitUrl"
def issueUrl = "${baseUrl}/yourGitIssueUrl"

def licenseIds = ['Apache-2.0']
def licenseNames = ['The Apache Software License, Version 2.0']
def licenseUrls = ['http://www.apache.org/licenses/LICENSE-2.0.txt']
def inception = '2016'

def username = 'lizhangqu'

install {
    repositories {
        mavenInstaller {
            pom.project {
                // Description
                name projectName
                description mavenDesc
                url siteUrl

                // Archive
                groupId 'cn.test.gradle'
                artifactId 'plugintest'
                version '3.0.0'

                // License
                inceptionYear inception
                licenses {
                    licenseNames.eachWithIndex { ln, li ->
                        license {
                            name ln
                            url licenseUrls[li]
                        }
                    }
                }
                developers {
                    developer {
                        name username
                    }
                }
                scm {
                    connection gitUrl
                    developerConnection gitUrl
                    url siteUrl
                }
            }
        }
    }
}

task sourcesJar(type: Jar) {
    from sourceSets.main.allGroovy
    classifier = 'sources'
}


task javadocJar(type: Jar, dependsOn: groovydoc) {
    from groovydoc.destinationDir
    classifier = 'javadoc'
}

artifacts {
    archives javadocJar
    archives sourcesJar
}


bintray {
    user = BINTRAY_USER
    key = BINTRAY_KEY
    configurations = ['archives']
    pkg {
        repo = 'maven'
        name = projectName
        desc = mavenDesc
        websiteUrl = siteUrl
        issueTrackerUrl = issueUrl
        vcsUrl = gitUrl
        labels = ['gradle', 'plugin', 'time']
        licenses = licenseIds
        publish = true
        publicDownloadNumbers = true
    }
}

在gradle.properties文件中加入BINTRAY_USER和BINTRAY_KEY。

BINTRAY_USER是 jcenter的账户名

BINTRAY_KEY 是jcenter的API Key

在插件的build.gradle文件中apply该grade文件: 

apply from: '../bintray.gradle'

 右侧的gradle的toolbar 先运行other下的install这个task,再执行bintrayUpload这个task,如果不出意外,就上传了,之后不要忘记到后台add to jcenter。成功add到jcenter之后就会有link to jcenter的字样

 

我们希望的是打印构建过程中各task执行的时间
package cn.test.gradle

import org.gradle.BuildListener
import org.gradle.BuildResult
import org.gradle.api.Task
import org.gradle.api.execution.TaskExecutionListener
import org.gradle.api.initialization.Settings
import org.gradle.api.invocation.Gradle
import org.gradle.api.tasks.TaskState
import org.gradle.util.Clock
import java.util.Date

class TimeListener implements TaskExecutionListener, BuildListener {
    private Clock clock
    private times = []

    @Override
    void beforeExecute(Task task) {
        clock = new Clock(new Date().getTime())
    }

    @Override
    void afterExecute(Task task, TaskState taskState) {
        long endTime = new Date().getTime()
        def ms = endTime - clock.getStartTime()
        times.add([ms, task.path])
        task.project.logger.warn "${task.path} spend ${ms} ms"
    }

    @Override
    void buildFinished(BuildResult result) {
        println "Task spend time:"
        for (time in times) {
            if (time[0] >= 50) {
                printf "%7sms  %s\n", time
            }
        }
    }

    @Override
    void buildStarted(Gradle gradle) {}

    @Override
    void projectsEvaluated(Gradle gradle) {}

    @Override
    void projectsLoaded(Gradle gradle) {}

    @Override
    void settingsEvaluated(Settings settings) {}
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值