上篇文章我们探讨了如何自定义 Task 类型,本文将深入讲解如何自定义 Plugin。
方式一:在 build.gradle 中直接定义
类似于在脚本中定义 Task,我们可以直接将 Plugin 的实现类写在 build.gradle 里。这种方式适合临时测试或简单场景,但不利于维护。
apply plugin: DateAndTimePlugin
dateAndTime {
timeFormat = 'HH:mm:ss.SSS'
dateFormat = 'MM/dd/yyyy'
}
class DateAndTimePlugin implements Plugin<Project> {
void apply(Project project) {
project.extensions.create("dateAndTime", DateAndTimePluginExtension)
project.task('showTime') << {
println "Current time is " + new Date().format(project.dateAndTime.timeFormat)
}
project.tasks.create('showDate') << {
println "Current date is " + new Date().format(project.dateAndTime.dateFormat)
}
}
}
class DateAndTimePluginExtension {
String timeFormat = "MM/dd/yyyyHH:mm:ss.SSS"
String dateFormat = "yyyy-MM-dd"
}
每个自定义 Plugin 都需要实现 Plugin<T> 接口。除了针对 Project,我们也可以为其他 Gradle 对象编写插件。接口中的 apply() 方法是核心入口,在这里我们可以操作 Project,比如添加 Task 或定义扩展属性。
上面的例子向 Project 添加了两个 Task:showTime 和 showDate。注意这里使用了不同的 Task 创建方式,具体细节可参考相关文档。
每个 Gradle Project 都维护了一个 ExtensionContainer,通过 project.extensions 访问。我们在插件中定义了名为 dateAndTime 的扩展,包含 timeFormat 和 dateFormat 两个属性。使用时只需在配置块中覆盖默认值即可。
方式二:在当前工程中定义(buildSrc)
为了提升复用性,建议将插件代码提取到 buildSrc/src/main/groovy 目录下。这样 Gradle 会在执行任务前自动构建该目录。
首先创建 DateAndTimePlugin.groovy:
package davenkin
import org.gradle.api.Plugin
import org.gradle.api.Project
class DateAndTimePlugin implements Plugin<Project> {
void apply(Project project) {
project.extensions.create("dateAndTime", DateAndTimePluginExtension)
project.task('showTime') << {
println "Current time is " + new Date().format(project.dateAndTime.timeFormat)
}
project.tasks.create('showDate') << {
println "Current date is " + new Date().format(project.dateAndTime.dateFormat)
}
}
}
再单独定义扩展类 DateAndTimePluginExtension.groovy:
package davenkin
class DateAndTimePluginExtension {
String timeFormat = "MM/dd/yyyyHH:mm:ss.SSS"
String dateFormat = "yyyy-MM-dd"
}
由于这两个类都在 davenkin 包下,应用插件时需要指定全限定名:
apply plugin: davenkin.DateAndTimePlugin
dateAndTime {
timeFormat = 'HH:mm:ss.SSS'
dateFormat = 'MM/dd/yyyy'
}

