一、什么是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
这里我把这个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
如果是1.使用java-gradle-plugin插件的方式的话这个文件可以不用创建,使用图片中的红框内容即可代替
image.png
像Arutor框架中的插件使用的是maven
image.png
由于我们的gradle版本是7.1的所以已经不支持maven了,谷歌推荐我们使用id 'maven-publish'
这里还要注意一个问题settings.gralde文件中的dependencyResolutionManagement
中的RepositoriesMode.FAIL_ON_PROJECT_REPOS
要改为RepositoriesMode.PREFER_PROJECT
不然会报错。
(3)、plugin文件实现
在src/mian/目录下创建java目录然后创建自己的包名目录,最后创建自己的MyPlugin文件。
image.png
MyPlugin文件实现了Plugin<Project>并覆写了apply方法。我们在方法中输出一个打印。
(4)、上传插件到本地仓库
点击sync按钮后在窗口右侧点击publish或publishToMavenLocal
image.png
publishToMavenLocal会在用户目录的.m2文件夹中生成插件
image.pngpublish会在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
网友评论