Gradle Plugin学习笔记之插件的建立

gradle插件的开发方式 就目前知道有二种html

1.直接在gradle文件内用groovy写,并直接引用java

2.建立buildSrc目录单独编译再引用android

实现原理上同样的,可是第二种更易于管理与发布,因此本文便以第二种方式来实践 文末为会附上第一种方式的实践代码web

tips:基于buildSrc下groovy的就不记录了,大同小异。着重记录使用kotlin来自定义插件markdown

1.建立java or kotlin module 取名: buildSrc

只能叫这个名字,buildSrc是gradle预留的插件开发目录 固然这只是android studio环境下的方式,其余方式参考官方文档便可 编译提示 'buildSrc' cannot be used as a project name as it is a reserved name 从settings.gradle里删除buildSrc从新编译就行,这毕竟是在android开发工具下,稍有水土不服app

2.配置编译依赖

若是不用kotlin 能够忽略 使用groovy时除了java版本号之外其余都可删除 顺带一提代码位置在src/main/kotlinsrc/main/java 均可以 不过只有一个有效,优先java目录jvm

// 使用 plugins 块语法应用插件
plugins {
    // 应用 kotlin 插件
    id 'org.jetbrains.kotlin.jvm' version '1.3.72'
}
repositories {
    google()
    jcenter()
}
dependencies {
    // 仅在编译时使用 Grdale-API 依赖
// compileOnly gradleApi() 目前暂时不知道gradleApi的做用 因此保持注释
    // 在插件源码中添加 kotlin 标准库依赖
    implementation 'org.jetbrains.kotlin:kotlin-stdlib'
}
java {
    sourceCompatibility = JavaVersion.VERSION_1_7
    targetCompatibility = JavaVersion.VERSION_1_7
}
复制代码

3.建立插件

android studio IDE下,建立完buildSrc会自动生成一个插件类,但它没继承插件接口ide

须要稍微改改函数

class GrockPlugin :Plugin<Project> {
    override fun apply(project: Project) {
       println("GrockPlugin apply")
    }
}
复制代码

若是找不到Plugin这个接口,不要慌。依赖一下gradle就行 打开buildSrc的build.gradle 添加依赖,gradle_version是项目根目录的gradle插件版本工具

dependencies {
  implementation "com.android.tools.build:gradle:$gradle_version"
}
复制代码

4.提供对外引用

按照文档要求整个声明文件便可

按以下目录建立一个[外部引用时的插件名称].properties文件

|____main
| |____resources
| | |____META-INF
| | | |____gradle-plugins
| | | | |____com.grock.properties
复制代码

如上此插件名为com.grock 打开[外部引用时的插件名称].properties文件,在其中指定插件类

implementation-class=com.grock.plugin.GrockPluginJava
复制代码

5.引用插件

新建一个module 引用便可

apply plugin:'com.grock'
复制代码

sync 查看日志

GrockPlugin apply
复制代码

6.自定义一个拓展函数

为何快马加鞭要先搞个拓展函数呢,基于目前的思考这东西能拿来当配置,因此优先尝试学习 相似于常见的android{}函数同样

6.1定义一个拓展函数类,不能是final的

open class GrockExtension {
    var name= "GrockExtension original-name"
}
复制代码

6.2建立一个拓展函数 grockName

override fun apply(project: Project) {
        //建立拓展函数,拓展函数名称,拓展函数类
        val extensionFun = project
            .extensions.create("grockName",GrockExtension::class.java)
        project.afterEvaluate {
            println("GrockPlugin-kotlin afterEvaluate:${extensionFun.name}")
        }
    }
复制代码

建立代码很好理解,最后两行的意义何在呢?为何不直接打印呢? 缘由很是简单,建立完拓展函数,插只是建立完这个拓展函数而在afterEvaluate回调时,插件已完成准备阶段,拓展函数都已读取,此时才能获取到拓展函数内的值

6.3使用拓展函数

apply plugin:'com.grock'

grockName{
    name "newName"
}
复制代码

打印内容:

GrockPlugin-kotlin afterEvaluate:newName
复制代码

直接在gradle内用groovy自定义插件

插件代码:

class GrockPlugin implements Plugin<Project>{
    @Override
    void apply(Project target) {
        println "GrokcPlugin apply"
// 建立拓展函数,声明拓展函数名 传入拓展类
        def extension = target.extensions.create("nameFunction",GrockExtension)
        target.afterEvaluate {//放在插件加完后执行,避免扩展函数未建立完成就访问
            println " apply extension.name=${extension.name}"
        }
    }
}
class GrockExtension{
    def name = "GrockExtension"
}
//从上到下逐个执行
apply plugin:GrockPluginJava
nameFunction {
    name("extension-name") //setName("s")
}
复制代码

插件引用:直接引用插件类

groovy语法上能够省略class

apply plugin:GrockPlugin
复制代码

参考:

相关文章
相关标签/搜索