1. 程式人生 > >Gradle自己定義插件

Gradle自己定義插件

local idm tin 演示 osi 類別 傳遞 posit guide

Gradle自己定義插件

在Gradle中創建自己定義插件,Gradle提供了三種方式:

  • 在build.gradle腳本中直接使用
  • 在buildSrc中使用
  • 在獨立Module中使用

開發Gradle插件能夠在IDEA中進行開發。也能夠在Android Studio中進行開發,它們唯一的不同,就是IDEA提供了Gradle開發的插件,比較方便創建文件和文件夾,而Android Studio中,開發人員須要手動創建(但實際上。這些文件夾並不多,也不復雜,全然能夠手動創建)。

在項目中使用

在Android Studio中創建一個標準的Android項目,整個文件夾結構例如以下所看到的:

├── app
│   ├── build.gradle
│   ├── libs
│   └── src
│       ├── androidTest
│       │   └── java
│       ├── main
│       │   ├── AndroidManifest.xml
│       │   ├── java
│       │   └── res
│       └── test
├── build.gradle
├── buildSrc
│   ├── build.gradle            ---1
│   └── src
│       └── main
│           ├── groovy          ---2
│ └── resources ---3 ├── gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── local.properties └── settings.gradle

當中。除了buildSrc文件夾以外,都是標準的Android文件夾,而buildSrc就是Gradle提供的在項目中配置自己定義插件的默認文件夾。開發Gradle要創建的文件夾,也就是RootProject/src/main/groovy和RootProject/src/main/resources兩個文件夾。

在配置完畢後,假設配置正確,相應的文件夾將被IDE所識別,成為相應類別的文件夾。

創建buildSrc/build.gradle—1

首先,先來配置buildSrc文件夾下的build.gradle文件。這個配置比較固定。腳本例如以下所看到的:

apply plugin: ‘groovy‘

dependencies {
    compile gradleApi()
    compile localGroovy()
}

創建Groovy腳本—2

接下來,在groovy文件夾下,創建一個Groovy類(與Java相似,能夠帶包名,但Groovy類以.grovvy結尾)。如圖所看到的:

技術分享

在腳本中通過實現gradle的Plugin接口,實現apply方法就可以,腳本例如以下所看到的:

package com.xys

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

public class MainPluginForBuildSrc implements Plugin<Project> {

    @Override
    void apply(Project project) {
        project.task(‘testPlugin‘) << {
            println "Hello gradle plugin in src"
        }
    }
}

在如上所看到的的腳本的apply方法中。筆者簡單的實現了一個task,命名為testPlugin。運行該Task。會輸出一行日誌。

創建Groovy腳本的Extension

所謂Groovy腳本的Extension。實際上就是相似於Gradle的配置信息,在主項目使用自己定義的Gradle插件時。能夠在主項目的build.gradle腳本中通過Extension來傳遞一些配置、參數。

創建一個Extension,僅僅須要創建一個Groovy類就可以。如圖所看到的:

技術分享

如上所看到的。筆者命名了一個叫MyExtension的groovy類,其腳本例如以下所看到的:

package com.xys;

class MyExtension {
    String message
}

MyExtension代碼很easy,就是定義了要配置的參數變量。後面筆者將詳細演示怎樣使用。

在Groovy腳本中使用Extension

在創建了Extension之後,須要改動下之前創建的Groovy類來載入Extension。改動後的腳本例如以下所看到的:

package com.xys

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

public class MainPluginForBuildSrc implements Plugin<Project> {

    @Override
    void apply(Project project) {

        project.extensions.create(‘pluginsrc‘, MyExtension)

        project.task(‘testPlugin‘) << {
            println project.pluginsrc.message
        }
    }
}

通過project.extensions.create方法,來將一個Extension配置給Gradle就可以。

創建resources—3

resources文件夾是標識整個插件的文件夾。其文件夾下的結構例如以下所看到的:

└── resources
└── META-INF
└── gradle-plugins

該文件夾結構與buildSrc一樣,是Gradle插件的默認文件夾,不能有不論什麽改動。創建好這些文件夾後,在gradle-plugins文件夾下創建——插件名.properties文件,如圖所看到的:

技術分享

如上所看到的。這裏筆者命名為pluginsrc.properties。在該文件裏。代碼例如以下所看到的:

implementation-class=com.xys.MainPluginForBuildSrc

通過上面的代碼指定最開始創建的Groovy類就可以。

在主項目中使用插件

在主項目的build.gradle文件裏,通過apply指令來載入自己定義的插件。腳本例如以下所看到的:

apply plugin: ‘pluginsrc‘

當中plugin的名字。就是前面創建pluginsrc.properties中的名字——pluginsrc,通過這樣的方式。就載入了自己定義的插件。

配置Extension

在主項目的build.gradle文件裏,通過例如以下所看到的的代碼來載入Extension:

pluginsrc{
    message = ‘hello gradle plugin‘
}

相同,領域名為插件名,配置的參數就是在Extension中定義的參數名。

配置完畢後,就能夠在主項目中使用自己定義的插件了,在終端運行gradle testPlugin指令,結果例如以下所看到的:

:app:testPlugin
hello gradle plugin

在本地Repo中使用

在buildSrc中創建自己定義Gradle插件僅僅能在當前項目中使用,因此,對於具有普遍性的插件來說。一般是建立一個獨立的Module來創建自己定義Gradle插件。

創建Android Library Module

首先。在主項目的工程中,創建一個普通的Android Library Module,並刪除其默認創建的文件夾。改動為Gradle插件所須要的文件夾,即在buildSrc文件夾中的全部文件夾,如圖所看到的:

技術分享

如上圖所看到的。創建的文件與在buildSrc文件夾中創建的文件都是一模一樣的,僅僅是這裏在一個自己定義的Module中創建插件而不是在默認的buildSrc文件夾中創建。

部署到本地Repo

由於是通過自己定義Module來創建插件的。因此。不能讓Gradle來自己主動完畢插件的載入。須要手動進行部署,所以,須要在插件的build.gradle腳本中添加Maven的配置,腳本例如以下所看到的:

apply plugin: ‘groovy‘
apply plugin: ‘maven‘

dependencies {
    compile gradleApi()
    compile localGroovy()
}

repositories {
    mavenCentral()
}

group=‘com.xys.plugin‘
version=‘2.0.0‘
uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: uri(‘../repo‘))
        }
    }
}

相比buildSrc中的build.gradle腳本,這裏添加了Maven的支持和uploadArchives這樣一個Task,這個Task的作用就是將該Module部署到本地的repo文件夾下。

在終端中運行gradle uploadArchives指令,將插件部署到repo文件夾下,如圖所看到的:

技術分享

當插件部署到本地後,就能夠在主項目中引用插件了。

當插件正式公布後,能夠把插件像其他module一樣公布到中央庫,這樣就能夠像使用中央庫的庫項目一樣來使用插件了。

引用插件

在buildSrc中。系統自己主動幫開發人員自己定義的插件提供了引用支持。但自己定義Module的插件中。開發人員就須要自己來加入自己定義插件的引用支持。

在主項目的build.gradle文件裏。加入例如以下所看到的的腳本:

apply plugin: ‘com.xys.plugin‘

buildscript {
    repositories {
        maven {
            url uri(‘../repo‘)
        }
    }
    dependencies {
        classpath ‘com.xys.plugin:plugin:2.0.0‘
    }
}

當中。classpath指定的路徑,就是相似compile引用的方式。即——插件名:group:version
配置完畢後,就能夠在主項目中使用自己定義的插件了,在終端運行gradle testPlugin指令,結果例如以下所看到的:

:app:testPlugin
Hello gradle plugin

假設不使用本地Maven Repo來部署,也能夠拿到生成的插件jar文件。拷貝到libs文件夾下,通過例如以下所看到的的代碼來引用:

classpath fileTree(dir: ‘libs‘, include: ‘\*.jar‘) // 使用jar

參考:https://docs.gradle.org/current/userguide/custom_plugins.html

Gradle自己定義插件