一、 创建插件的方法
1. buildSrc
方式组织,创建插件
Gradle项目会优先查找
buildSrc
目录,以includeBuild
的方式处理目录下项目。
方便本地项目使用。
- rootProject/buildSrc/src/main/java 目录下,创建插件源文件
buildSrc
下创建 配置文件build.gralde
文档:buildSrc
2. 创建 独立的 插件项目
命令行 或 IDE创建 插件项目,下面以 Gradle命令创建:
# 创建使用Java的插件
gradle init --type java-gradle-plugin
# 或,创建使用Kotlin的插件
gradle init --type kotlin-gradle-plugin
本地使用或调试,引入插件 项目(composing build):
pluginManagement {
includeBuild '../myplugin'
}
二、声明插件
1. build.gradle 声明插件
新创建项目,默认在 build.gradle 中,gradlePlugin
块 中配置插件ID 和 插件实现类:
gradlePlugin {
plugins {
greeting {
id = 'com.example.myplugin.greeting'
implementationClass = 'com.example.myplugin.MyPluginPlugin'
}
}
}
2. 资源文件中声明插件
最终通过 资源目录 src/main/resources/META-INF/gradle-plugins
,
以 插件id 为名的 {plugin-id}.properties
文件,来实现 插件的查找:
implementation-class=com.example.myplugin.MyPluginPlugin
注:第1种方法,最终也是 生成上述 .properties
文件。由gradle插件 java-gradle-plugin
根据 gradlePlugin
块 自动生成。
文档:How does Gradle find the Plugin implementation?
三、 项目中 使用 插件
上面说到 本地 includeBuild
来编译依赖插件:
1. plugins
DSL 使用:
在 项目中 build.gradle
,使用:
plugins {
id 'com.example.myplugin.greeting'
}
语法:
plugins {
id <<plugin id>>
id <<plugin id>> version <<plugin version>> [apply <<false>>]
}
- 第一种是 核心插件 或 已经在buildscript中的插件;
- 需要被解析的插件,一般是 第三方插件。
2. 传统的方法:
对于 以前不支持 plugins
DSL 的插件,使用 老的方法:
apply plugin: 'com.example.myplugin.greeting'
文档:docs.gradle.org/current/use…
Plugin Marker Artifacts
以 {pluginId}.gradle.plugin
命名发布的Artifact,可以只用 插件ID,来
查找依赖的库。
查找定位逻辑:{pluginId}:{pluginId}.gradle.plugin:{version}
,这样的方式称为 Plugin Marker Artifcats
。
文档:
多项目 插件 统一版本
在 多项目工程中,对于 根项目(rootProject)可以 利用 plugins
的 apply
属性来统一版本。
在 根项目下的 build.gradle
中,声明:
// 根项目 build.gradle
plugins {
id('com.example.myplugin.greeting') version '1.0' apply false
}
// 子项目中 build.gradle 配置,无需 配置版本
plugins {
id('com.example.myplugin.greeting')
}
通常默认配置会 立马 解析(resolve) 并 应用(apply) 插件。
而apply
设为false
, 表示 不应用插件到 根项目。目的是 提前解析 插件,保持一样的版本。
旧的插件
使用 buildscript
脚本块,添加到 脚本的classpath中。
引用方法 组+插件ID+版本号:{group}:{pluginId}:{version}
// 参考 Android 项目插件
// 根项目 build.gradle
buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
}
}
// 项目 build.gradle
apply plugin: 'com.android.application'
文档:Applying external plugins with same version to subprojects
四、插件发布
参考之前文章:MavenCentral库发布记录