Appearance
插件开发基础
Gradle 插件允许将可复用的构建逻辑打包成独立单元,供多个项目使用。
插件的三种形式
| 形式 | 位置 | 适用场景 |
|---|---|---|
| 脚本插件 | .gradle.kts 文件 | 简单的脚本共享 |
| buildSrc 插件 | buildSrc/ 目录 | 项目内共享 |
| 独立插件 | 独立项目 | 跨项目共享、发布 |
最简单的插件
kotlin
// buildSrc/src/main/kotlin/MyPlugin.kt
import org.gradle.api.Plugin
import org.gradle.api.Project
class MyPlugin : Plugin<Project> {
override fun apply(project: Project) {
project.tasks.register("myPluginTask") {
group = "my-plugin"
description = "由 MyPlugin 注册的任务"
doLast {
println("Hello from MyPlugin!")
}
}
}
}kotlin
// 使用
plugins {
id("MyPlugin")
}
// 或者
apply<MyPlugin>()带配置的插件(Extension)
kotlin
// buildSrc/src/main/kotlin/GreetPlugin.kt
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.provider.Property
abstract class GreetExtension {
abstract val greeting: Property<String>
abstract val target: Property<String>
init {
greeting.convention("Hello")
target.convention("World")
}
}
class GreetPlugin : Plugin<Project> {
override fun apply(project: Project) {
// 创建 Extension
val extension = project.extensions.create("greet", GreetExtension::class.java)
// 注册使用 Extension 配置的任务
project.tasks.register("greet") {
group = "greet"
doLast {
println("${extension.greeting.get()}, ${extension.target.get()}!")
}
}
}
}kotlin
// 使用插件
apply<GreetPlugin>()
greet {
greeting = "Hi"
target = "Gradle"
}约定插件(Precompiled Script Plugin)
约定插件是最推荐的方式,使用 .gradle.kts 文件定义:
kotlin
// buildSrc/src/main/kotlin/java-conventions.gradle.kts
plugins {
java
}
java {
sourceCompatibility = JavaVersion.VERSION_17
}
tasks.withType<JavaCompile> {
options.encoding = "UTF-8"
}
tasks.withType<Test> {
useJUnitPlatform()
}kotlin
// 子项目 build.gradle.kts
plugins {
id("java-conventions") // 插件 ID = 文件名
}插件 ID 规则
插件 ID 必须是:
- 小写字母、数字和
- - 通常使用反向域名:
com.example.my-plugin - buildSrc 约定插件 ID = 文件名(不含扩展名)
下一步
- 脚本插件 - 简单的脚本共享
- buildSrc 插件 - buildSrc 中的插件
- 独立插件项目 - 可发布的插件