二进制插件工程创建有两种方式:
- 创建独立的工程,调试的时候,需要手动发布成一个二进制插件jar包,给其他工程里面引用,进行功能测试。这种方式是比较麻烦的。
- 创建buildSrc子工程,它是一个大工程中的子工程,把插件的逻辑写在里面,这样Gradle在构建的时候就会自动将其打包为一个二进制插件jar包。
注:以下示例基于Gradle8.0
1、创建一个buildSrc子工程
- 在根目录下新建文件夹buildSrc
- 在buildSrc中新建build.gradle文件
build.gradle
//引用 Groovy 插件,编译插件工程中的代码
plugins{id 'groovy'
}//声明仓库地址
repositories {jcenter()
}//声明依赖包
dependencies {implementation gradleApi()implementation localGroovy()
}
- 在buildSrc目录下创建目录src/main/groovy/包名
- 新建 RouterPlugin.groovy 文件
RouterPlugin.groovy
package com.leon.router.gradleimport org.gradle.api.Plugin
import org.gradle.api.Projectclass RouterPlugin implements Plugin<Project>{//实现apply方法,注入插件逻辑@Overridevoid apply(Project target) {println("我是 RouterPlugin 中的 apply() 方法,我来自工程 ${target.name}")}
}
- 在 buildSrc/main目录下新建目录resources/META-INF.gradle-plugins
- 新建 标识ID.properties 文件
com.leon.rt.properties
implementation-class=com.leon.router.gradle.RouterPlugin
- 在 app 目录下的 build.gradle,通过标识ID引入我们的插件
- 同步一下,执行命令行"./gradlew clean -q"
- 执行完了之后,我们可以看到自动生成了一个 buildSrc.jar、RouterPlugin.class文件
2、实现参数配置
2.1、定义 Extension
- 在 RouterPlugin.groovy同目录下创建 RouterExtension.groovy 文件
RouterExtension.groovy
package com.leon.router.gradle//定义 Extension
class RouterExtension {String projectNameString projectPath
}
2.2、注册 Extension
- 在 RouterPlugin.groovy 中注册 RouterExtension.groovy
package com.leon.router.gradleimport org.gradle.api.Plugin
import org.gradle.api.Projectclass RouterPlugin implements Plugin<Project>{//实现apply方法,注入插件逻辑@Overridevoid apply(Project target) {println("我是 RouterPlugin 中的 apply() 方法,我来自工程 ${target.name}")//注册 Extensiontarget.getExtensions().create("leonEx", RouterExtension)}}
}
2.3、使用 Extension
- 在 app 目录下的 build.gradle 使用 注册的 leonEx
2.4、获取 Extension
- 在 RouterPlugin.groovy 中获取用户设置的 leonEx 参数
package com.leon.router.gradleimport org.gradle.api.Plugin
import org.gradle.api.Projectclass RouterPlugin implements Plugin<Project>{//实现apply方法,注入插件逻辑@Overridevoid apply(Project target) {println("我是 RouterPlugin 中的 apply() 方法,我来自工程 ${target.name}")//注册 Extensiontarget.getExtensions().create("leonEx", RouterExtension)//获取 Extensiontarget.afterEvaluate {//当前工程 Gradle 配置阶段已结束//到了这一步就可以拿到用户配置的 leonEx 了RouterExtension extension = target["leonEx"]println("用户配置------项目名称:${extension.projectName} 项目路径: ${extension.projectPath}")}}
}
- 执行命令行 “./gradlew clean -q”