本文将介绍编写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
解决方法
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插件。