一、以库项目形式创建插件
1.创建项目
如果仅仅是自己项目中来自定义插件,不对外发布,那么可以按照以下的语法来构建目录
1.1 创建一个Module,选择Java Library项目,项目名称必须是 buildSrc,否则插件不被识别
1.2 构建目录 buildSrc/src/main/groovy 本路径android studio会自动识别为 groovy类。
1.3、在main目录中再构建 resources/META-INF/gradle-plugins,这个目录是groovy项目的资源文件目录。
注意,插件的代码可以是java实现,编程方式比较繁琐,这里我们使用groovy语言。
2、代码实现
新建groovy文件 CustomPluginTest.groovy,代码如下
package com.ncf.plg
import org.gradle.api.Plugin
import org.gradle.api.Project
class CustomPluginTest implements Plugin{
@Override
void apply(Project project) {
//增加闭包名称,闭包为customPlugin,是 CustomPluginTestExtension类型,因此CustomPluginTestExtension类型中的JaveBean类型的属性可以任意设置
project.extensions.add("personInfo",PersonInfo) //personInfo用于build.gradle中添加配置块
project.task("showPersonInfo") << {
if(project.personInfo==null) return ;
println("姓名:" + project.personInfo.name)
println("年龄:" + project.personInfo.age)
println("地址:" + project.personInfo.address)
}
project.extensions.add("bookInfo",BookInfo);
project.task("showBookInfo",dependsOn:"showPersonInfo" ) << {
//注意,showBookInfo依赖showPersonInfo,dependsOn:"showPersonInfo"
def book = project.extensions.findByType(BookInfo);
println("喜欢的书籍:" + book.name + ", " + book.id + ", " + book.price+'元'+','+book.address+","+book.isbn);
}
}
}
PersonInfo类
package com.ncf.plg
class PersonInfo {
def name = "init";
def age = "init";
def address = "init";
}
BookInfo类
package com.ncf.plg
class BookInfo {
def name = "《红楼们》";
def isbn = "SW.SH.CN.I.20181227";
def address = "北京市海淀区西北旺";
def price = 25.9f
def id = 'BS1001029'
}
buildSrc 中的 build.gradle的定义,引入groovy插件,并依赖 gradleApi()、localGroovy()。
apply plugin:'groovy' #必须
group='com.ncf.plg'
version='3.0.0'
dependencies {
implementation gradleApi() #必须
implementation localGroovy() #必须
implementation fileTree(dir: 'libs', include: ['*.jar'])
}
repositories {
mavenCentral() #必须
}
sourceCompatibility = "1.7"
targetCompatibility = "1.7"
配置MyCustomPlugin.properties
implementation-class=com.ncf.plg.CustomPluginTest
3、使用插件
在app项目的build.gradle中,我们引用插件
import com.ncf.plg.PersonInfo
apply plugin: 'MyCustomPlugin' //properties的名称
personInfo{
name='张三'
age=25
address='北京市海淀区朝阳路'
}
4、调用任务
执行如下命令
gradle showBookInfo 【如果是windows系统,调用gradlew showBookInfo】
执行结果如下
> Configure project :app
> Task :app:showPersonInfo
姓名:张三
年龄:25
地址:北京市海淀区朝阳路
> Task :app:showBookInfo
喜欢的书籍:《红楼们》, BS1001029, 25.9元,北京市海淀区西北旺,SW.SH.CN.I.20181227