Gradle Builds Everything —— 從 0 開始作插件

今天開始,咱們實戰下 Gradle 插件開發,首先咱們的視角仍是鎖定 Android Gradle Plugin 開發。html

建立工程

咱們使用 Intellij IDEA 來建立一個普通的 Gradle Java 工程。建立完成後,設置好 Gradle Wrapper,工程一開始長這樣:java

初始工程

咱們把 Gradle Wrapper 版本改爲最新的穩定版,目前是 6.0.1,後面使用-all引入 Gradle 的源碼,方便咱們查看 Gradle 的 API 實現,理解 API 接口。linux

注:Gradle Plugin 的開發不必定要使用 Groovy,這是一個誤導,這裏只要是 JVM 環境內的語言均可以,我我的推薦 Java 和 Kotlin,Groovy 閉包的某些特性實在是有點坑,我的不太喜歡它。

這樣,工程初始化就作完了。android

導入依賴

由於咱們基於 Gradle 和 Android Gradle Plugin 開發,所以確定要引入這兩個依賴,引入的方式很簡單,以下便可:
導入依賴api

這樣依賴也導入完成啦,接下來咱們就能夠開發咱們的插件了。閉包

聲明插件

官方向導:https://docs.gradle.org/curre...
官方提供了三種方式寫插件:app

  1. 寫構建腳本
  2. 使用 buildSrc 項目(即業務工程內的插件工程)
  3. 獨立工程

咱們使用第三種方式建立。maven

咱們定義一個插件類,叫AppPlugin,插件的入口在這,當咱們在 build.gradle 中 apply 咱們插件的時候,這裏的回調函數就會被調用:ide

package com.gemini.build;

import org.gradle.api.Plugin;
import org.gradle.api.Project;

public class AppPlugin implements Plugin<Project> {

    @Override
    public void apply(Project target) {
        System.out.println("Hello World!");
    }
}

導出插件

咱們須要在 META-INF 中導出咱們的插件,方式很是簡單,咱們建立一個文件,文件路徑以下:函數

src/main/resources/META-INF/gradle-plugins/{插件ID}.properties

好比我使用 id 是 com.gemini.application,配置完成後,以下圖:

導出插件

安裝插件到本地

到此爲止,咱們的插件工程建立完了,只要應用咱們插件的時候,項目應該就會打印一個Hello World!,那麼怎麼把咱們的插件應用到咱們的項目中呢?咱們能使用的方式是把插件安裝在本地 maven 倉庫裏,安裝方式很簡單,在咱們的插件工程下,先應用maven插件,而後執行:

./gradlew clean install

便可

安裝在本地

這樣,你的插件就安裝在了本地路徑,mac/linux 下應該是 ~/.m2/repository/ 下。

引入插件

新建一個 Android 項目,在 root project 上添加 apply plugin:'maven',而後刪除clean的任務,在buildscript結點中,添加剛剛建立插件的 GAV,這個 GAV 在你建立插件工程的時候應該能看見

插件 GAV

在這種狀況下,咱們的 classpath 就設置成com.gemini.build:android-gradle-plugin:1.0-SNAPSHOT

那麼,Android 工程中的設置就像這樣:

Android Studio Project

Sync 下,發現咱們添加的 classpath 應該沒有問題了,而後咱們須要在 app 項目中應用插件

應用插件

在 app 模塊下的 build.gradle 中,使用剛剛咱們在 META-INF 中設定的值 apply plugin:'com.gemini.application'

App 模塊應用插件

這時候咱們執行任意任務,就能獲得結果了:

查看效果

調試插件

調試插件蠻多人很好奇,其實調試很簡單,可是不少人問,因此我在這裏也順便說一下,調試的方式分兩塊,插件工程的設置和 Android 工程的設置。

插件工程設置

咱們須要在 Run Configuration 中增長一個 Debug 的設置就好,像這樣:

Debug

設置完了以後,執行 Android 工程下的 gradle 命令:

./gradlew clean assembleDebug -Dorg.gradle.debug=true --no-daemon

Gradle 開啓 Daemon 後會暫停

10.png

這時候咱們在插件工程裏設置好斷點,點 Debug 按鈕,代碼執行到的時候,就會在該行斷點停下來:

Debug

歡迎關注個人公衆號「TalkWithMobile」
公衆號

相關文章
相關標籤/搜索