7.gradle插件入门以及发布插件

391 阅读4分钟

本文将介绍编写Gradle插件的三种主要方法,并提供简单易懂的入门级示例。

1、脚本插件

我们可以直接在构建脚本中包含插件的源代码,这种是最简单易懂的一种方式,具体示例如下:

class BuildGradle implements Plugin<Project> {
    @Override
    void apply(Project project) {
        println "在build.gradle写的一个插件,哈哈哈"
    }
}

//直接在build中写插件,方式1 
apply plugin: BuildGradle

android {
    compileSdk 32
		
		......
}

dependencies {
    implementation 'androidx.core:core-ktx:1.7.0'
    implementation 'androidx.appcompat:appcompat:1.3.0'
    implementation 'com.google.android.material:material:1.4.0'
}

sync一下:

Configure project :app 在build.gradle写的一个插件,哈哈哈 task myTask2 configuration task myTask configuration A new task named 'assembleDebug' has been added. project afterEvaluate

可以看到执行了println 语句

2、buildSrc

可以将插件的源代码放在rootProjectDir/buildSrc/src/main/groovy目录中,Gradle会自动识别来完成编译和测试。 在工程根目录下建立/buildSrc/src/main/kotlin目录 如图

在这里插入图片描述

buildSrc中的build.gradle 如下:

//由Gradle官方提供的,用于辅助开发和发布自定义的Gradle插件。这个插件为开发者提供了一系列工具和约定,
//使得创建、测试以及打包Gradle插件变得更加简单
apply plugin: 'java-gradle-plugin'

//本地依赖插件时使用
gradlePlugin {
    plugins {
        //插件名,每一个插件都可以有
        routerPlugin {
            id = 'com.ww.gradle.buildSrc'
            implementationClass = 'com.ww.gradle.BuildSrcGradlePlugin'
        }
        //第二个插件
//        test2Plugin {
//            id = xxx
//            implementationClass = xxx
//        }
    }
}
dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.10"
}

可以看到我们应用了'java-gradle-plugin'插件,并且添加了gradlePlugin闭包,这样我们就不需要手动创建resource即META-INF目录下的properties 。其实并不是我们没有创建,而是我们使用的 java-gradle-plugin 插件会自动帮我们将上述的步骤实现,在build目录下可以查到,新建插件也只需要增加一个闭包即可,如test2Plugin,而不需要再创建一个properties文件,当然如果插件特别多,十几个或者几十个,会导致builid.gradle文件代码较多

使用:

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    //方式2,buildSrc
    id 'com.ww.gradle.buildSrc'
}

sync一下:

> Configure project :app
> Unable to detect AGP versions for included builds. All projects in the build should use the same AGP version. Class name for the included build object: org.gradle.composite.internal.DefaultIncludedBuild$IncludedBuildImpl_Decorated.
> 使用BuildSrc方式创建的插件
> weiwei :in build.gradle afterEvaluate 

> Task :prepareKotlinBuildScriptModel UP-TO-DATE

3、单独项目

跟buildSrc 差不多,只不过需要单独发布,并且在使用时需要添加相应的插件仓库,举例:

1.新建一个project或者module 名字随意,如下: 在这里插入图片描述

2、在该模块下的build.gradle里添加依赖,以及添加maven-publish插件,build.gradle如下:

apply plugin: 'kotlin'
apply plugin: 'java-gradle-plugin'
apply plugin: 'maven-publish'


//本地依赖插件时使用
gradlePlugin {
    plugins {
        standardGradlePlugin {
            id = 'com.ww.gradle.standardGradlePlugin'
            implementationClass = 'com.ww.gradle.StandardGradlePlugin'
        }
    }
}

sourceCompatibility = JavaVersion.VERSION_11
publishing {
    publications {
        maven(MavenPublication) {
            //插件名称 建议和github仓库名称对应,jitpack只看github
            groupId "com.ww.gradle"
            artifactId "standardGradlePlugin"
            version "1.0.0"
            from components.java
        }
    }
    //插件仓库
    repositories {
//        maven {
//            url uri('../repo')
//        }
        mavenLocal()
    }
}

dependencies {
    implementation gradleApi()
}

可以看到,publishing代码块配置GAV以及代码要发布的仓库,这里我们用mavenLocal(),即~/.m2/repository,发布成功后可以到此目录查看。这里也可以配置其他仓库比如公司自己的nexus私仓,或者其他本地目录,比如我这里配置了项目根目录的repo文件夹

可能出现的报错 Build was configured to prefer settings repositories over project repositories but repository 'Gradle Libs' was added by unknown code

解决方法 img

3.编写插件类

class StandardGradlePlugin : Plugin<Project> {

    companion object {
        private const val TAG = "StandardGradlePlugin"
    }

    override fun apply(project: Project) {
        println("单独项目创建的gradle插件3333")
    }
}

4.发布到mavenlocal

执行./gradlew :standard_gradle_plugin:publish 或者 点击右侧gradle-->standard_gradle_plugin-->publishing-->publish

在这里插入图片描述

执行完成后,cd ~/.m2/repository 目录发现多了如下两个文件夹: 在这里插入图片描述

即发布成功。

5.使用插件

项目根目录build.gradle添加插件仓库和依赖:

buildscript {
    repositories {
        google()
        mavenCentral()
        mavenLocal()
    }
    dependencies {
        classpath 'com.ww.gradle:standardGradlePlugin:1.0.0'
    }
}

plugins {
    id 'com.android.application' version '7.2.0' apply false
    id 'com.android.library' version '7.2.0' apply false
    id 'org.jetbrains.kotlin.android' version '1.7.10' apply false
    //不知道为什么这种依赖方式找不到插件
//    id 'com.ww.gradle.StandardGradlePlugin' version '1.0.0' apply false
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

app目录的build.gradle 依赖此插件:

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'com.ww.gradle.buildSrc'
    //
    id 'com.ww.gradle.standardGradlePlugin'
}

apply plugin: BuildGradle

syncy一下:

Configure project :app 使用BuildSrc方式创建的插件 单独项目创建的gradle插件 在build.gradle写的一个插件,哈哈哈 task myTask2 configuration task myTask configuration A new task named 'assembleDebug' has been added. project afterEvaluate

可以看到我们依赖的三种方式创建的插件都打印了。

另外,插件中apply方法执行在我们之前说的gradle运行生命周期的configuration阶段,如果我们不想通过点击android studio的sync按钮或者执行task来触发configuration,查看效果,可以仅执行./gradlew,这么执行 不会执行任何task,同时会执行完configuration阶段。

下一篇我们进行一下gradle插件的实战,开发一个有用的gradle插件。