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