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
複製代碼

參考:

相關文章
相關標籤/搜索