美文网首页
自定义Gradle插件

自定义Gradle插件

作者: SunnyDay_ab5f | 来源:发表于2023-05-30 20:29 被阅读0次

    一、什么是Gradle插件?

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

    plugins {
        id 'com.android.application'
    }
    

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

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

    • Build script脚本
      把插件写在build.gradle文件中,一般用于简单的逻辑,只在该build.gradle文件中可见。
    • buildSrc项目
      将插件源代码放在buildSrc/src/main/中,只对该项目可见。
    • 独立项目
      一个独立的java项目/模块,可以将文件包发布到仓库(Jcenter或本地仓库),对所有工程可见。

    本文只对第三种方式的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

    相关文章

      网友评论

          本文标题:自定义Gradle插件

          本文链接:https://www.haomeiwen.com/subject/zyzjzrtx.html