Gradle Gradle 插件

2022-08-03 14:57 更新

Gradle 在它的核心中有意地提供了一些小但有用的功能,用于在真實世界中的自動化。所有有用的功能,例如以能夠編譯 Java 代碼為例,都是通過插件進行添加的。插件添加了新任務(wù) (例如JavaCompile),域?qū)ο?(例如SourceSet),約定(例如主要的 Java 源代碼是位于 src/main/java),以及擴展的核心對象和其他插件的對象。

在這一章中,我們將討論如何使用插件以及術(shù)語和插件相關(guān)的概念。

應(yīng)用插件

插件都認(rèn)為是被應(yīng)用,通過 Project.apply() 方法來完成。

應(yīng)用插件

build.gradle

apply plugin: 'java'  

插件都有表示它們自己的一個短名稱。. 在上述例子中,我們使用短名稱 java 去應(yīng)用 JavaPlugin。

我們還可以使用下面的語法:

通過類型應(yīng)用插件

build.gradle

apply plugin: org.gradle.api.plugins.JavaPlugin  

由于 Gradle 的默認(rèn)導(dǎo)入,您還可以這樣寫:

通過類型應(yīng)用插件

build.gradle

apply plugin: JavaPlugin  

插件的應(yīng)用是冪等的。也就是說,一個插件可以被應(yīng)用多次。如果以前已應(yīng)用了該插件,任何進一步的應(yīng)用都不會再有任何效果。

一個插件是任何實現(xiàn)了 Plugin 接口的簡單的類。Gradle 提供了核心插件作為其發(fā)行包的一部分,所以簡單地應(yīng)用如上插件是你所需要做的。然而,對于第三方插件,你需要進行配置以使插件在構(gòu)建類路徑中可用。有關(guān)如何進行此操作的詳細(xì)信息。

插件都做了什么

把插件應(yīng)用到項目中可以讓插件來擴展項目的功能。它可以做的事情如:

  • 將任務(wù)添加到項目 (如編譯、 測試)
  • 使用有用的默認(rèn)設(shè)置對已添加的任務(wù)進行預(yù)配置。
  • 向項目中添加依賴配置 (見“依賴管理基礎(chǔ)”)。
  • 通過擴展對現(xiàn)有類型添加新的屬性和方法。

讓我們來看看:

通過插件添加任務(wù)

build.gradle

apply plugin: 'java'
task show << {
    println relativePath(compileJava.destinationDir)
    println relativePath(processResources.destinationDir)
}  

gradle -q show 的輸出結(jié)果

> gradle -q show
build/classes/main
build/resources/main  

Java 插件已經(jīng)向項目添加了 compileJava 任務(wù)和 processResources 任務(wù),并且配置了這兩個任務(wù)的 destinationDir 屬性。

約定

插件可以通過智能的方法對項目進行預(yù)配置以支持約定優(yōu)于配置。Gradle 對此提供了機制和完善的支持,而它是強大-然而-簡潔的構(gòu)建腳本中的一個關(guān)鍵因素。

在上面的示例中我們看到,Java 插件添加了一個任務(wù),名字為 compileJava ,有一個名為 destinationDir 的屬性(即配置編譯的 Java 代碼存放的地方)。Java 插件默認(rèn)此屬性指向項目目錄中的 build/classes/main。這是通過一個合理的默認(rèn)的約定優(yōu)于配置的例子。

我們可以簡單地通過給它一個新的值來更改此屬性。

更改插件的默認(rèn)設(shè)置

build.gradle

apply plugin: 'java'
compileJava.destinationDir = file("$buildDir/output/classes")
task show << {
    println relativePath(compileJava.destinationDir)
}  

gradle -q show 的輸出結(jié)果

> gradle -q show
build/output/classes  

然而,compileJava 任務(wù)很可能不是唯 一需要知道類文件在哪里的任務(wù)。

Java 插件添加了 source sets 的概念 (見SourceSet) 來描述的源文件集的各個方面,其中一個方面是在編譯的時候這些類文件應(yīng)該被寫到哪個地方。Java 插件將 compileJava 任務(wù)的 destinationDir 屬性映射到源文件集的這一個方面。

我們可以通過這個源碼集修改寫入類文件的位置。

插件中的約定對象

build.gradle

apply plugin: 'java'
sourceSets.main.output.classesDir = file("$buildDir/output/classes")
task show << {
    println relativePath(compileJava.destinationDir)
}  

gradle -q show 的輸出結(jié)果

> gradle -q show
build/output/classes  

在上面的示例中,我們應(yīng)用 Java 插件,除其他外,還做了下列操作:

  • 添加了一個新的域?qū)ο箢愋停?SourceSet
  • 通過屬性的默認(rèn)(即常規(guī))配置了 main 源碼集
  • 配置支持使用這些屬性來執(zhí)行工作的任務(wù)

所有這一切都發(fā)生在 apply plugin: "java" 這一步過程中。在上面例子中,我們在約定配置被執(zhí)行之后,修改了類文件所需的位置。在上面的示例中可以注意到,compileJava.destinationDir 的值也被修改了,以反映出配置的修改。

考慮一下另一種消費類文件的任務(wù)的情況。如果這個任務(wù)使用 sourceSets.main.output.classesDir 的值來配置,那么修改了這個位置的值,無論它是什么時候被修改,將同時更新 compileJava 任務(wù)和這一個消費者任務(wù)。

這種配置對象的屬性以在所有時間內(nèi)(甚至當(dāng)它更改的時候)反映另一個對象的任務(wù)的值的能力被稱為“映射約定”。它可以令 Gradle 通過約定優(yōu)于配置及合理的默認(rèn)值來實現(xiàn)簡潔的配置方式。而且,如果默認(rèn)約定需要進行修改時,也不需要進行完全的重新配置。如果沒有這一點,在上面的例子中,我們將不得不重新配置需要使用類文件的每個對象。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號