背景
有时候,我们会需要在项目中用到自定义Gradle插件,但大多数时间通过tasks.register已经足够。但是,往往有时候这样会容易造成脚本文件代码过于臃肿,且还不能更好的复用。这时候我们需要编写自己的Gradle插件。
创建gradle项目
在安卓项目根目录中创建一个文件夹,例如example-plugin,然后在里面创建一个根脚本,用于描述脚本及它的应用,例如:
plugins {
`kotlin-dsl`
}
repositories {
google()
mavenCentral()
}
dependencies {
implementation("com.android.tools.build:gradle:8.13.2")
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:2.3.20")
implementation("org.yaml:snakeyaml:2.6")
implementation("com.squareup.okhttp3:okhttp:4.12.0")
implementation("com.squareup.okhttp3:logging-interceptor:4.12.0")
}
gradlePlugin {
plugins {
create("example-plugin"){
id = "com.example.plugin"
group = "custom"
implementationClass = "ExamplePlugin"
}
}
}
这样,我们完成了一个插件项目的声明,接着编写插件类: ExamplePlugin
ExamplePlugin创建在项目中:src/main/kotlin下
astract class ExampleTaskExtension {
abstract val inputArg: Property<String>
}
abstract class ExampleTask@Inject constructor(
private val execOperations: ExecOperations //如果要执行命令行,用这个注入对象
) : DefaultTask(){
@get: Input
abstract val inputArg: Property<String>
@TaskAction
fun runTask(){
val myInputArg = inputArg.get()
logger.lifecycle("任务参数:$myInputArg")
}
}
class ExamplePlugin : Plugin<Project> {
override fun apply(target: Project) {
val extension = target.extensions.create(
"exampleTaskConfig",
ExampleTaskExtension::class.java
)
target.tasks.register<ExampleTask>("RunExampleTask") {
group = "插件分组"
description = "插件任务描述"
inputArg.set(extension.inputArg.convention(...默认值)) //设置输入参数
.... /// 其他代码
}
}
}
好的,你现在已经创建好了一个插件了,我们把它搬运到主项目中去
主项目集成Gradle
首先在项目 settings.gradle.kts 中导入这个插件
...
pluginManagement {
...
includeBuild("./example-plugin")
}
...
在项目app模块引用入这个插件 build.gradle.kts
plugins {
id("com.example.plugin")
...
}
...
exampleTaskConfig {
inputArg = "xxxx" //配置插件参数
}
配置完成,刷新gradle,使项目进入正常状态,此时我们就能在 gradle 面板中找到我们定义的任务了
- gradle面板
- 插件分组
- RunExampleTask // [tip = "插件任务描述"]