Gradle自定义插件的三种方式

101 阅读3分钟

用“魔法师学徒”的故事,结合代码带你一步步理解Gradle自定义插件的三种方式。假设你是一个刚学魔法的学徒,需要用Gradle这个魔法工具箱制作三种不同类型的魔法药水。


故事背景:Gradle魔法工坊

Gradle就像一个强大的魔法工坊,它的核心是一组基础魔法(编译、打包、依赖管理)。但真正强大的魔法(如编译Android代码、生成APK)需要通过​​插件​​来实现。自定义插件就像是你自己调配的特殊药水配方,可以赋予Gradle新的魔力。


第一种方式:直接在build.gradle里写配方(临时药水)

​适用场景​​:快速实验,只在当前项目生效(就像一次性药水)。

groovy
Copy
// 在项目的build.gradle里直接写插件代码
class MyFirstPlugin implements Plugin<Project> {
    void apply(Project project) {
        // 添加一个自定义任务
        project.task("helloTask") {
            doLast {
                println "Hello, I'm a custom task from build.gradle!"
            }
        }
    }
}

// 应用插件(必须放在文件末尾)
apply plugin: MyFirstPlugin

​执行魔法​​:

bash
Copy
./gradlew helloTask
# 输出:Hello, I'm a custom task from build.gradle!

​优点​​:简单快捷,无需额外配置。
​缺点​​:代码和项目耦合,无法复用。


第二种方式:buildSrc魔法仓库(万能药水配方库)

​适用场景​​:在同一个项目内复用插件(就像工坊里的万能药水架)。

  1. ​创建魔法仓库目录​
    在项目根目录下新建 buildSrc 文件夹,结构如下:

    Copy
    buildSrc/
    └── src/
        └── main/
            └── groovy/  # Groovy代码放这里
                └── MyReusablePlugin.groovy
    
  2. ​编写插件代码​
    MyReusablePlugin.groovy:

    groovy
    Copy
    import org.gradle.api.Plugin
    import org.gradle.api.Project
    
    class MyReusablePlugin implements Plugin<Project> {
        void apply(Project project) {
            project.extensions.create("myConfig", MyConfig) // 添加配置扩展
            
            project.task("configurableTask") {
                doLast {
                    println "Hello, config is ${project.myConfig.message}"
                }
            }
        }
    }
    
    // 配置类(可选)
    class MyConfig {
        String message = "Default message"
    }
    
  3. ​在build.gradle中使用​

    groovy
    Copy
    // 自动加载buildSrc中的插件
    apply plugin: MyReusablePlugin
    
    // 配置插件参数
    myConfig {
        message = "From build.gradle!"
    }
    

​执行魔法​​:

bash
Copy
./gradlew configurableTask
# 输出:Hello, config is From build.gradle!

​优点​​:代码与项目分离,可在同一项目内复用。
​缺点​​:仍无法跨项目共享。


第三种方式:独立魔法工坊(全球共享药水配方)

​适用场景​​:将插件发布给团队或全世界使用(就像出售魔法药水的商店)。

步骤1:创建独立插件项目

  1. 新建一个纯Groovy项目:

    Copy
    my-gradle-plugin/
    └── src/
        └── main/
            └── groovy/
                └── com/
                    └── example/
                        └── MyPublishablePlugin.groovy
    └── build.gradle
    
  2. ​编写插件代码​
    MyPublishablePlugin.groovy:

    groovy
    Copy
    package com.example
    
    import org.gradle.api.Plugin
    import org.gradle.api.Project
    
    class MyPublishablePlugin implements Plugin<Project> {
        void apply(Project project) {
            project.task("globalTask") {
                doLast {
                    println "Hello from global plugin!"
                }
            }
        }
    }
    
  3. ​配置插件元数据​
    在 src/main/resources/META-INF/gradle-plugins 目录下创建:

    Copy
    com.example.myplugin.properties
    

    内容:

    Copy
    implementation-class=com.example.MyPublishablePlugin
    
  4. ​添加Gradle API依赖​
    build.gradle:

    groovy
    Copy
    plugins {
        id 'groovy'
        id 'maven-publish' // 支持发布到仓库
    }
    
    group = 'com.example'     // 插件组名
    version = '1.0.0'         // 版本号
    repositories {
        mavenCentral()
    }
    dependencies {
        implementation gradleApi() // 必须添加Gradle API依赖
        implementation localGroovy()
    }
    

步骤2:发布插件到本地仓库

bash
Copy
./gradlew publishToMavenLocal

生成的插件会存放在 ~/.m2/repository/com/example/my-gradle-plugin/1.0.0/

步骤3:在其他项目中使用插件

groovy
Copy
// 项目中的build.gradle
plugins {
    id 'com.example.myplugin' version '1.0.0' // 直接通过ID引用
}

// 或者通过传统方式
buildscript {
    repositories {
        mavenLocal() // 优先从本地仓库找
    }
    dependencies {
        classpath 'com.example:my-gradle-plugin:1.0.0'
    }
}
apply plugin: 'com.example.myplugin'

​执行魔法​​:

bash
Copy
./gradlew globalTask
# 输出:Hello from global plugin!

​优点​​:可跨项目、跨团队复用,支持版本管理。
​缺点​​:需要发布到仓库,流程较复杂。


三种方式的对比

方式适用场景复杂度示例用途
build.gradle直写快速实验,仅当前项目使用简单测试新功能
buildSrc仓库同一项目内复用中等多模块项目共享构建逻辑
独立项目+发布团队协作或开源复杂公司内部工具链或开源插件

小结:Gradle插件就像魔法药水

  • ​直接写在build.gradle​​:像一次性药水,简单但局限。
  • ​buildSrc仓库​​:像工坊里的药水架,方便同一项目复用。
  • ​独立项目发布​​:像魔法商店,让全世界都能使用你的配方。

掌握这三种方式后,你就可以像高级魔法师一样,随心所欲地扩展Gradle的功能了!🧙♂️✨