二進制插件工程創建有兩種方式:
- 創建獨立的工程,調試的時候,需要手動發布成一個二進制插件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”