创建项目
-
根目录创建 buildSrc 文件夹,在文件夹内创建 build.gradle 文件,添加配置信息,然后构建。
buildSrc/build.gradle
// 引用 groovy 插件,编译插件工程中的代码 apply plugin: 'groovy' // 声明仓库地址 repositories { jcenter() } // 声明依赖的包 dependencies { implementation gradleApi() implementation localGroovy() }
-
新建 src/main 源码目录,创建
com.imooc.router.gradle
包,在包内创建自定义插件 RouterPlugin。package com.imooc.router.gradle import org.gradle.api.Plugin import org.gradle.api.Project class RouterPlugin implements Plugin<Project> { /** * 实现 apply 方法,注入插件的逻辑 * @param project */ @Override void apply(Project project) { } }
-
resources 配置文件目录,在目录下创建 META-INF\gradle-plugins 目录,然后创建 com.imooc.router.properties 配置文件,用于配置插件信息。
com.imooc.router.properties
implementation-class=com.imooc.router.gradle.RouterPlugin
-
自定义插件属性
RouterExtension.groovy
class RouterExtension { String wikiDir }
-
配置插件属性
RouterPlugin.groovy
class RouterPlugin implements Plugin<Project> { /** * 实现 apply 方法,注入插件的逻辑 * @param project */ @Override void apply(Project project) { // 为自定义插件添加扩展参数 project.getExtensions().create('router',RouterExtension) } }
发布插件
-
插件工程配置 maven 信息
buildSrc/build.gradle
// 调用maven插件,用于发布 apply plugin: 'maven' uploadArchives { repositories { mavenDeployer { // 设置发布路径 工程根目录下面的 repo 文件夹 repository(url:uri('../repo')) { // 设置groupId,通常为包名 pom.groupId = 'com.imooc.router' // 设置 artifactId 为当前插件的名称 pom.artifactId = 'router-gradle-plugin' // 设置 插件的版本号 pom.version = '1.0.0' } } } }
-
将插件源码复制到新的工程
cp -rf buildSrc router-gradle-plugin
-
在 settings.gradle 引入插件工程
include ':app',':router-gradle-plugin' rootProject.name = "pluginPro"
-
发布到本地maven
gradle :router-gradle-plugin:uploadArchives
使用插件
-
声明插件依赖
工程 build.gradle
buildscript { repositories { // 1.配置Maven 仓库地址 可以使相对地址,也可使是绝对路径 maven { url uri('D:\\Users\\lihl\\android\\pluginPro\\repo') } google() jcenter() } dependencies { classpath "com.android.tools.build:gradle:4.1.1" // 2.声明依赖的插件 classpath "com.imooc.router:router-gradle-plugin:1.0.0" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } }
-
引入插件
app/build.gradle
plugins { id 'com.android.application' id 'com.imooc.router' // 3.应用自定义插件 } // 4. 向路由插件传递参数 router { wikiDir getRootDir().absolutePath }