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) {}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章