在Gradle中建立本身定义插件,Gradle提供了三种方式:html
开发Gradle插件可以在IDEA中进行开发。也可以在Android Studio中进行开发,它们惟一的不一样,就是IDEA提供了Gradle开发的插件,比較方便建立文件和文件夹,而Android Studio中,开发人员需要手动建立(但实际上。这些文件夹并很少,也不复杂,全然可以手动建立)。java
在Android Studio中建立一个标准的Android项目,整个文件夹结构例如如下所看到的:android
├── app
│ ├── build.gradle
│ ├── libs
│ └── src
│ ├── androidTest
│ │ └── java
│ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── res
│ └── test
├── build.gradle
├── buildSrc
│ ├── build.gradle ---1
│ └── src
│ └── main
│ ├── groovy ---2
│ └── resources ---3
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle
当中。除了buildSrc文件夹之外,都是标准的Android文件夹,而buildSrc就是Gradle提供的在项目中配置本身定义插件的默认文件夹。开发Gradle要建立的文件夹,也就是RootProject/src/main/groovy和RootProject/src/main/resources两个文件夹。api
在配置完毕后,假设配置正确,相应的文件夹将被IDE所识别,成为相应类别的文件夹。bash
首先,先来配置buildSrc文件夹下的build.gradle文件。这个配置比較固定。脚本例如如下所看到的:markdown
apply plugin: 'groovy'
dependencies { compile gradleApi() compile localGroovy() }
接下来,在groovy文件夹下,建立一个Groovy类(与Java类似,可以带包名,但Groovy类以.grovvy结尾)。如图所看到的:app
在脚本中经过实现gradle的Plugin接口,实现apply方法就能够,脚本例如如下所看到的:maven
package com.xys
import org.gradle.api.Plugin
import org.gradle.api.Project
public class MainPluginForBuildSrc implements Plugin<Project> {
@Override
void apply(Project project) {
project.task('testPlugin') << {
println "Hello gradle plugin in src"
}
}
}
在如上所看到的的脚本的apply方法中。笔者简单的实现了一个task,命名为testPlugin。运行该Task。会输出一行日志。ide
所谓Groovy脚本的Extension。实际上就是类似于Gradle的配置信息,在主项目使用本身定义的Gradle插件时。可以在主项目的build.gradle脚本中经过Extension来传递一些配置、參数。post
建立一个Extension,仅仅需要建立一个Groovy类就能够。如图所看到的:
如上所看到的。笔者命名了一个叫MyExtension的groovy类,其脚本例如如下所看到的:
package com.xys;
class MyExtension {
String message
}
MyExtension代码很easy,就是定义了要配置的參数变量。后面笔者将详细演示怎样使用。
在建立了Extension以后,需要改动下以前建立的Groovy类来载入Extension。改动后的脚本例如如下所看到的:
package com.xys
import org.gradle.api.Plugin
import org.gradle.api.Project
public class MainPluginForBuildSrc implements Plugin<Project> {
@Override
void apply(Project project) {
project.extensions.create('pluginsrc', MyExtension)
project.task('testPlugin') << {
println project.pluginsrc.message
}
}
}
经过project.extensions.create方法,来将一个Extension配置给Gradle就能够。
resources文件夹是标识整个插件的文件夹。其文件夹下的结构例如如下所看到的:
└── resources
└── META-INF
└── gradle-plugins
该文件夹结构与buildSrc同样,是Gradle插件的默认文件夹,不能有不论什么改动。建立好这些文件夹后,在gradle-plugins文件夹下建立——插件名.properties文件,如图所看到的:
如上所看到的。这里笔者命名为pluginsrc.properties。在该文件里。代码例如如下所看到的:
implementation-class=com.xys.MainPluginForBuildSrc
经过上面的代码指定最開始建立的Groovy类就能够。
在主项目的build.gradle文件里,经过apply指令来载入本身定义的插件。脚本例如如下所看到的:
apply plugin: 'pluginsrc'
当中plugin的名字。就是前面建立pluginsrc.properties中的名字——pluginsrc,经过这样的方式。就载入了本身定义的插件。
在主项目的build.gradle文件里,经过例如如下所看到的的代码来载入Extension:
pluginsrc{ message = 'hello gradle plugin' }
相同,领域名为插件名,配置的參数就是在Extension中定义的參数名。
配置完毕后,就可以在主项目中使用本身定义的插件了,在终端运行gradle testPlugin指令,结果例如如下所看到的:
:app:testPlugin
hello gradle plugin
在buildSrc中建立本身定义Gradle插件仅仅能在当前项目中使用,所以,对于具备广泛性的插件来讲。通常是创建一个独立的Module来建立本身定义Gradle插件。
首先。在主项目的工程中,建立一个普通的Android Library Module,并删除其默认建立的文件夹。改动为Gradle插件所需要的文件夹,即在buildSrc文件夹中的所有文件夹,如图所看到的:
如上图所看到的。建立的文件与在buildSrc文件夹中建立的文件都是如出一辙的,仅仅是这里在一个本身定义的Module中建立插件而不是在默认的buildSrc文件夹中建立。
因为是经过本身定义Module来建立插件的。所以。不能让Gradle来本身主动完毕插件的载入。需要手动进行部署,因此,需要在插件的build.gradle脚本中添加Maven的配置,脚本例如如下所看到的:
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
compile gradleApi()
compile localGroovy()
}
repositories {
mavenCentral()
}
group='com.xys.plugin'
version='2.0.0'
uploadArchives {
repositories {
mavenDeployer {
repository(url: uri('../repo'))
}
}
}
相比buildSrc中的build.gradle脚本,这里添加了Maven的支持和uploadArchives这样一个Task,这个Task的做用就是将该Module部署到本地的repo文件夹下。
在终端中运行gradle uploadArchives指令,将插件部署到repo文件夹下,如图所看到的:
当插件部署到本地后,就可以在主项目中引用插件了。
当插件正式公布后,可以把插件像其余module同样公布到中央库,这样就可以像使用中央库的库项目同样来使用插件了。
在buildSrc中。系统本身主动帮开发人员本身定义的插件提供了引用支持。但本身定义Module的插件中。开发人员就需要本身来加入本身定义插件的引用支持。
在主项目的build.gradle文件里。加入例如如下所看到的的脚本:
apply plugin: 'com.xys.plugin'
buildscript { repositories { maven { url uri('../repo') }
}
dependencies { classpath 'com.xys.plugin:plugin:2.0.0' }
}
当中。classpath指定的路径,就是类似compile引用的方式。即——插件名:group:version
配置完毕后,就可以在主项目中使用本身定义的插件了,在终端运行gradle testPlugin指令,结果例如如下所看到的:
:app:testPlugin
Hello gradle plugin
假设不使用本地Maven Repo来部署,也可以拿到生成的插件jar文件。拷贝到libs文件夹下,经过例如如下所看到的的代码来引用:
classpath fileTree(dir: 'libs', include: '\*.jar') // 使用jar
參考:https://docs.gradle.org/current/userguide/custom_plugins.html