自定义Gradle插件

2023-05-30  本文已影响0人  SunnyDay_ab5f

一、什么是Gradle插件?

Gradle 和 Gradle 插件是两个完全不同的概念,Gradle 提供的是一套核心的构建机制,而 Gradle 插件则是运行在这套机制上的一些具体构建逻辑,例如我们常见的gradle插件就是:

plugins {
    id 'com.android.application'
}

'com.android.application'便是Android提供的用于构建APK的一个gradle插件。Gradle 插件打包了可重用的构建逻辑片段,可以在许多不同的项目和构建中使用。Gradle 允许您实现自己的插件,因此您可以重用您的构建逻辑,并与他人共享。

二、实现Gradle插件的3种方式

本文只对第三种方式的gradle插件进行说明,其他方式可以参考文章:Android Gradle插件开发基础

三、独立项目gradle插件的实现

(1)创建一个javalib

注意选择 java or kotlin library

image.png
这里我把这个javalib命名为test_plugin工程目录如下图: image.png

(2)test_plugin中的build.gradle编写

1.使用java-gradle-plugin插件的方式

plugins {
    id 'maven-publish'
    id 'java-gradle-plugin'
}

java {
    sourceCompatibility = JavaVersion.VERSION_1_7
    targetCompatibility = JavaVersion.VERSION_1_7
}

gradlePlugin {
    plugins {
        standaloneGradlePlugins {
            id = 'test_plugin'
            implementationClass = 'com.example.test_plugin.MyPlugin'
        }
    }
}



publishing {
    repositories {
        maven {
            // $rootDir 表示你项目的根目录
            // 这里配置发布到的本地目录
            url = "$rootDir/repo"
        }
    }

    publications {
        maven(MavenPublication) {

            // 插件的组ID,建议设置为插件的包名
            groupId = 'com.example.test_plugin'
            // 插件的名字,后续在引用时会用到
            artifactId = 'MyPlugin'
            version = '1.0.0'
            // 组件类型
            from components.java
        }
    }
}



2.不适用java-gradle-plugin插件的方式

plugins {
    id 'maven-publish'
    id 'groovy'
}


java {
    sourceCompatibility = JavaVersion.VERSION_1_7
    targetCompatibility = JavaVersion.VERSION_1_7
}


dependencies {
    implementation gradleApi()
}

publishing {
    publications {
        maven(MavenPublication) {
            groupId = 'ccom.example.test_plugin'
            artifactId = 'MyPlugin'
            version = '1.0.0'
            from components.java
        }
    }

    repositories {
        maven {
            // change to point to your repo, e.g. http://my.org/repo
            url = layout.buildDirectory.dir('repo')
        }
    }
}

不使用java-gradle-plugin就必须添加 id 'groovy支持,依赖implementation gradleApi()并且需要在resources目录下创建META-INF目录,并在META-INF中创建test_plugin.properties文件。

image.png
文件内容为: image.png
如果是1.使用java-gradle-plugin插件的方式的话这个文件可以不用创建,使用图片中的红框内容即可代替
image.png

像Arutor框架中的插件使用的是maven


image.png

由于我们的gradle版本是7.1的所以已经不支持maven了,谷歌推荐我们使用id 'maven-publish'

image.png

这里还要注意一个问题settings.gralde文件中的dependencyResolutionManagement中的RepositoriesMode.FAIL_ON_PROJECT_REPOS要改为RepositoriesMode.PREFER_PROJECT不然会报错。

image.png

(3)、plugin文件实现

在src/mian/目录下创建java目录然后创建自己的包名目录,最后创建自己的MyPlugin文件。


image.png

MyPlugin文件实现了Plugin<Project>并覆写了apply方法。我们在方法中输出一个打印。

(4)、上传插件到本地仓库

点击sync按钮后在窗口右侧点击publish或publishToMavenLocal


image.png

publishToMavenLocal会在用户目录的.m2文件夹中生成插件

image.png

publish会在gradle文件中指定的路径中生成插件,我们指定的是根目录的repo目录中

image.png image.png

(5)引用插件

新建一个项目并在project的build.gradle中添加path

image.png

在app的build.gradle中引用插件


image.png

这里由于使用的是本地仓库需要在setting.gradle添加本地仓库

image.png

点击sync按钮可以看到我们自定义插件的打印

image.png
上一篇 下一篇

猜你喜欢

热点阅读