概述
前面的博客Gradle 使用指南 – 创建Plugin 介绍了如何去创建一个插件,那么这篇文章将介绍一些深入的知识:如何对自定义插件进行 DSL 扩展。
在博客Gradle 使用指南 – Android DSL 扩展 Android 插件对 Gradle 进行的 DSL 扩展,那么我们自定义插件也是完全可以做到的。
Gradle 官方文档:Writing Custom Plugins
DSL 扩展基本实现
ExtensionContainer DSL 实现扩展
我们在进行 Gradle 配置时,很多的配置都是在 build.gradle 文件中进行的,插件可以在构建过程中获取这些输入。我们自定义的插件也是可以做到这一点的。这就要借助 ExtensionContainer
来实现。
怎么来得到一个 ExtensionContainer
对象呢?我们来看一下 Project
的 getExtensions()
方法:
ExtensionContainer getExtensions();
它的返回者是一个 ExtensionContainer
对象。
通过 ExtensionContainer
我们可以向目标对象添加DSL扩展,通过 ExtensionContainer
的 create()
方法来创建新的 DSL 域,并与一个对应的委托类关联起来(即新建一个 DSL 域,并委托给一个具体类),通过它来跟踪传递给插件的所有设置和属性。
首先实现一个扩展类:
class MyExtension {
String message
Boolean isDebug
String getMessage() {
return message
}
void setMessage(String message) {
println "set message = "+message
this.message = message
}
}
然后在插件中的 apply
方法中通过 project.extensions.create()
创建DSL扩展:
public class MyFirstPlugin implements Plugin<Project>{
@Override
void apply(Project project) {
// 创建一个扩展属性 myExtension,使用 MyExtension 进行管理外部属性配置
project.extensions.create('myExtension', MyExtension.class)
// 实现一个名称为myPlugin的task
project.task('myPlugin') << {
println project.myExtension.message
println project.myExt