- 創建任務,并在“自定義”插件中使用它
- 獨立的自定義插件
- 簡短的插件ID
- 使用settings.gradle自定義Gradle設置
項目信息:
搖籃版本:1.1 操作系統平臺:Ubuntu 12.10 先決條件:基本了解Gradle腳本。
創建獨立的自定義插件
- 創建目錄結構
|-custom-plugin| |-plugin| |-src| |-main| | |-groovy| | | |-com| | | |-code4reference | | | |-gradle| | |-resources | | | |-META-INF| | | |-gradle-plugins | |-test| | |-groovy| | | |-com| | | |-code4reference | | | |-gradle |-user
這里的插件目錄包含所有源代碼和資源文件,而用戶目錄包含使用自定義插件的使用者腳本。 執行以下命令以創建目錄結構。 這里的groovy文件夾包含源代碼包。
$ mkdir -p custom-plugin/plugin/src/main/groovy/com/code4reference/gradle$ mkdir -p custom-plugin/plugin/src/main/resources/META-INF/gradle-plugins$ mkdir -p custom-plugin/user
- 自定義插件源代碼
每個插件都應該有一個實現類來擴展Plugin類。 讓我們定義插件類。
package com.code4reference.gradle;import org.gradle.api.*;class Code4ReferencePlugin implements Plugin {def void apply(Project project) {//c4rTask task has been defined below.project.task('c4rTask') << {println 'Hi from Code4Reference plugin!'}} }
將此文件放在custom-plugin / plugin / src / main / groovy / com / code4reference / gradle目錄中。 在這里, c4rTask任務已定義為打印一條簡單的線。
- 簡短的插件ID
為了應用插件,我們通常使用一個簡短的ID,例如apply plugin:'java'。 這里的“ java”是org.gradle.api.plugins.JavaPlugin類的簡短插件ID。 簡短的插件ID可以通過簡單的步驟進行定義。 為此,我們需要創建一個屬性文件,并將其放在類路徑下的META-INF / gradle-plugins目錄中。 文件名將是我們的短ID。 該屬性文件必須包含以下所示的行,并且應指向插件實現類。 讓我們將屬性文件創建為code4reference.properties,并將其指向Code4ReferencePlugin類。
implementation-class=com.code4reference.gradle.Code4ReferencePlugin
- Gradle腳本生成插件
為了編譯和構建此插件,我們將編寫gradle腳本。 在插件目錄中創建名為build.gradle的文件, 然后在其中復制下面的內容。
apply plugin: 'groovy' apply plugin: 'maven' dependencies {compile gradleApi()groovy localGroovy() } repositories {mavenCentral() }group='com.code4reference' //Group name makes easier to manager the packages. version='1.1-SNAPSHOT'uploadArchives {repositories {mavenDeployer {repository(url: uri('../repo'))}} }
在此gradle腳本中,我們使用groovy插件編譯groovy源代碼,并將gradleAPI聲明為編譯時間依賴項。 您可能已經注意到我們使用了maven插件。 它基本上會創建插件jar文件并將其存儲在maven存儲庫中。 在這里,我們在父目錄中創建名為repo的Maven存儲庫,并將jar文件存儲在其中。
- 構建插件并放入存儲庫
$ gradle uploadArchives #This will put the plugin-version.jar in maven repository.:compileJava UP-TO-DATE :compileGroovy UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :jar :uploadArchives Uploading: com/code4reference/plugin/1.1-SNAPSHOT/plugin-1.1-20120816.163101-1.jar to repository remote at file:/home/rakesh/programming/mygitrepo/Code4Reference/GradleExample/custom-plugin-1/repo/ Transferring 5K from remote Uploaded 5KBUILD SUCCESSFULTotal time: 34.892 secs
- 使用settings.gradle注入設置
當執行以上命令時,gradle會從settings.gradle中獲取項目名稱。 如果當前目錄中不存在settings.gradle文件,則它將獲取當前目錄的名稱并將其假定為項目名稱。 然后,它形成存儲jar文件的路徑。 文件路徑約定如下/group/name/projectName/version/projectname-version-timestamp.jar 。 您可能會在上面的輸出中注意到jar路徑名和jar文件名帶有插件字,因為當前目錄名是plugin,并且gradle假定它為項目名。 如果要覆蓋此屬性,并將code4ReferencePlugin作為項目名稱,則需要在插件目錄中創建settings.gradle文件,并放入下一行。
rootProject.name = 'code4ReferencePlugin'
現在再次執行命令以生成插件jar文件。
$gradle uploadArchives compileJava UP-TO-DATE :compileGroovy UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :jar UP-TO-DATE :uploadArchives Uploading: com/code4reference/code4ReferencePlugin/1.1-SNAPSHOT/code4ReferencePlugin-1.1-20120816.164441-5.jar to repository remote at file:/home/rakesh/programming/mygitrepo/Code4Reference/GradleExample/custom-plugin-1/repo/ Transferring 5K from remote Uploaded 5KBUILD SUCCESSFULTotal time: 8.61 secs
現在問題解決了。 該jar將以名稱code4ReferencePlugin- [version] -timestamp.jar生成。 如果要查找有關gradle和系統屬性的更多信息,請在此處找到。
使用自定義插件
這確實是一個簡單的步驟。 盡管我們使用其他插件,但是自定義插件也可以類似的方式使用。 現在在用戶目錄中創建另一個build.gradle文件,并復制下面給出的代碼。
buildscript {repositories {maven {url uri('../repo')}}dependencies {classpath group: 'com.code4reference',name: 'code4ReferencePlugin',version: '1.1-SNAPSHOT'}
}
apply plugin: 'code4reference'
build.gradle腳本訪問父目錄中存在的Maven存儲庫。 我們還定義了依賴關系,該依賴關系基本上是從Maven訪問jar文件的特定版本。 最后但并非最不重要的一點是,我們應用簡短的插件ID“ code4reference”。 要運行此gradle腳本,請在用戶目錄中的終端上執行以下命令。
$ gradle c4rTask #Remember we have created c4rTask in Code4ReferencePlugin class.#You will get the following output.
:c4rTask
Hi from Code4Reference plugin!BUILD SUCCESSFULTotal time: 3.908 secs
Voilà! 您剛剛創建了自定義插件,并在其他項目腳本中使用了它。 您可以在此處找到本教程的源代碼。 Code4參考
現在,將涵蓋以下主題。
- 定義自定義任務類
- 將參數傳遞給自定義插件任務
- 嵌套參數
- 測試自定義插件
項目信息:
項目名稱:Gradle自定義插件
搖籃版本:1.1 操作系統平臺:Ubuntu 12.10 先決條件:基本了解Gradle腳本。
在這里,我們將遵循第一部分中列出的相同目錄層次結構。
- 定義自定義任務
讓我們定義一個名為Code4ReferenceTask的自定義類,該類擴展了DefaultTask類,并將此文件放在保存Code4ReferencePlugin.groovy的同一文件夾中。 這個類包含一個名為showMessage(),這是標注有@TaskAction方法。 執行任務時,Gradle會調用此方法。
package com.code4reference.gradle;import org.gradle.api.DefaultTask import org.gradle.api.tasks.TaskActionclass Code4ReferenceTask extends DefaultTask {@TaskActiondef showMessage() {println '----------showMessage-------------'} }
現在,我們需要在Code4ReferencePlugin.groovy中進行一些小的修改,以包含自定義任務。 修改后的Code4ReferencePlugin類如下。
package com.code4reference.gradle;import org.gradle.api.*;class Code4ReferencePlugin implements Plugin {def void apply(Project project) {//Define the task named c4rTask of type Code4ReferenceTaskproject.task('c4rTask', type: Code4ReferenceTask)} }
您可能會注意到,與過去的實現相比,只有突出顯示的行已更改。 現在,“ c4rTask”是Code4ReferenceTask類型的。 在插件目錄中執行gradle uploadArchives命令。 這將更新Maven存儲庫中的jar文件。 現在,使用相同的舊build.gradle在用戶目錄中執行以下命令。 我們將獲得以下輸出。
$gradle c4rTask :c4rTask ----------showMessage------------- BUILD SUCCESSFULTotal time: 14.057 secs
- 將參數傳遞給自定義插件任務
上面的實現是最簡單的,并沒有做很多事情。 如果我們想將Gradle腳本的參數傳遞給該任務怎么辦? 我們可以通過訪問擴展對象來實現。 Gradle項目具有一個關聯的ExtensionContainer對象,該對象有助于跟蹤傳遞給插件類的所有設置和屬性。 讓我們定義一個擴展類,它可以容納參數并將其傳遞給Task類。 Code4ReferencePlugin類中的突出顯示的行有助于將參數傳遞給Task類。
package com.code4reference.gradle;import org.gradle.api.*;//For passing arguments from gradle script. class Code4ReferencePluginExtension {String message = 'Hello from Code4Reference'String sender = 'Code4Reference' } class Code4ReferencePlugin implements Plugin {def void apply(Project project) {project.extensions.create('c4rArgs', Code4ReferencePluginExtension)project.task('c4rTask', type: Code4ReferenceTask)} }
我們已將Code4ReferencePluginExtension定義為Extension類,其中包含兩個變量message和sender。 這些用作自定義任務的參數。 我們需要修改Code4RefernceTask類以訪問參數。 高亮顯示的行已添加到以前的Code4ReferenceTask類實現中。
package com.code4reference.gradle;import org.gradle.api.DefaultTask import org.gradle.api.tasks.TaskActionclass Code4ReferenceTask extends DefaultTask {@TaskActiondef showMessage() {println '------------showMessage-------------------'println 'From : ${project.c4rArgs.sender},\message : ${project.c4rArgs.message}'} }
在插件目錄中執行gradle uploadArchives命令。 這將更新Maven存儲庫中的jar文件。 另外,我們需要更新用戶目錄中的build.gradle。
//custom-plugin-2/user buildscript {repositories {maven {url uri('../repo')}}dependencies {classpath group: 'com.code4reference',name: 'code4ReferencePlugin',version: '1.2-SNAPSHOT'} }apply plugin: 'code4reference'c4rArgs {sender = 'Rakesh'message = 'Hello there !!!!' }
您可能已經注意到,已經添加了c4rArgs閉包,并且在閉包中設置了發件人和消息變量。 這兩個變量可在showMessage()方法中訪問。 現在運行用戶目錄中存在的build.gradle。 我們得到以下輸出。
$gradle c4rTask :c4rTask -------------------------showMessage----------------------------- From : Rakesh, message : Hello there !!!!BUILD SUCCESSFULTotal time: 15.817 secs
- 嵌套參數
如果我們想傳遞嵌套參數怎么辦? 我們可以通過嵌套擴展對象來實現。 這是Code4ReferencePlugin類的代碼。 此類中僅添加了突出顯示的行。
package com.code4reference.gradle;import org.gradle.api.*;//Extension class for nested argumetns class C4RNestedPluginExtention {String receiver = 'Admin'String email = 'admin@code4reference.com'} //For keeping passing arguments from gradle script. class Code4ReferencePluginExtension {String message = 'Hello from Code4Reference'String sender = 'Code4Reference'C4RNestedPluginExtention nested = new C4RNestedPluginExtention() } class Code4ReferencePlugin implements Plugin {def void apply(Project project) {project.extensions.create('c4rArgs', Code4ReferencePluginExtension)project.c4rArgs.extensions.create('nestedArgs',C4RNestedPluginExtention)project.task('c4rTask', type: Code4ReferenceTask)} }
現在也該修改Code4ReferenceTask類。 在此類中添加了突出顯示的行,以訪問嵌套的參數。
package com.code4reference.gradle;import org.gradle.api.DefaultTask import org.gradle.api.tasks.TaskActionclass Code4ReferenceTask extends DefaultTask {@TaskActiondef showMessage() {println '------------showMessage-------------------'println 'From : ${project.c4rArgs.sender},\message : ${project.c4rArgs.message}'println 'To : ${project.c4rArgs.nestedArgs.receiver},\email : ${project.c4rArgs.nestedArgs.email}'} }
在插件目錄中再次執行gradle uploadArchives命令以更新Maven存儲庫中的jar文件。 現在,修改用戶目錄中存在的build.gradle文件以傳遞嵌套參數。
buildscript {repositories {maven {url uri('../repo')}}dependencies {classpath group: 'com.code4reference',name: 'code4ReferencePlugin',version: '1.2-SNAPSHOT'} }apply plugin: 'code4reference'c4rArgs {sender = 'Rakesh'message = 'Hello there !!!!'nestedArgs{receiver = 'gradleAdmin'email = 'gradleAdmin@code4reference.com'} }
我們已在build.gradle文件中添加了突出顯示的行。
- 測試插件和任務
代碼測試是代碼開發的重要方面。 現在,我們將為自定義任務和插件添加單元測試。 為此,我們需要為測試類創建目錄結構。 我們需要將測試文件夾放在src目錄中。 在插件目錄中執行以下命令以創建測試目錄。
$mkdir -p src/test/groovy/com/code4reference/gradle/
測試目錄結構遵循用于源代碼包目錄的相同包目錄結構。 在此目錄中,放入Code4ReferencePlugin和Code4ReferenceTask的測試類。 在測試類中,ProjectBuilder用于訪問項目對象。 這些測試用例易于編寫,類似于Junit測試用例。 測試類的代碼如下:
package com.code4reference.gradle;import org.junit.Test import org.gradle.testfixtures.ProjectBuilder import org.gradle.api.Project import static org.junit.Assert.*class Code4ReferenceTaskTest {@Testpublic void canAddTaskToProject() {Project project = ProjectBuilder.builder().build()def task = project.task('c4rtakstest', type: Code4ReferenceTask)assertTrue(task instanceof Code4ReferenceTask)} }
package com.code4reference.gradle;import org.junit.Test import org.gradle.testfixtures.ProjectBuilder import org.gradle.api.Project import static org.junit.Assert.*class Code4ReferencePluginTest {@Testpublic void code4referencePluginAddsCode4ReferenceTaskToProject() {Project project = ProjectBuilder.builder().build()project.apply plugin: 'code4reference'println 'code4referencePluginAddsCode4ReferenceTaskToProject'assertTrue(project.tasks.c4rTask instanceof Code4ReferenceTask)} }
要運行測試,請在plugin文件夾中執行以下命令。
$gradle test #For success test cases. :compileJava UP-TO-DATE :compileGroovy UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :compileTestJava UP-TO-DATE :compileTestGroovy :processTestResources UP-TO-DATE :testClasses :testBUILD SUCCESSFULTotal time: 42.799 secs$gradle test #In case of test case failure,#you can expect output similar to given below. :compileJava UP-TO-DATE :compileGroovy UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :compileTestJava UP-TO-DATE :compileTestGroovy :processTestResources UP-TO-DATE :testClasses :testcom.code4reference.gradle.Code4ReferencePluginTest > code4referencePluginAddsCode4ReferenceTaskToProject FAILEDjava.lang.AssertionError at Code4ReferencePluginTest.groovy:142 tests completed, 1 failedFAILURE: Build failed with an exception.* What went wrong: Execution failed for task ':test'. > There were failing tests. See the report at: file:///home/rakesh/programming/mygitrepo/Code4Reference/GradleExample/custom-plugin-2/plugin/build/reports/tests/index.html* Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.BUILD FAILED
Gradle測試提供了測試報告及其位置。 可以使用任何瀏覽器打開此文件以檢查堆棧跟蹤。
您可以在此處找到源代碼 。
參考: Gradle自定義插件(第1部分) , ? 我們的JCG合作伙伴 Rakesh Cusat的Gradle自定義插件(第2部分)位于Code4Reference博客上。
翻譯自: https://www.javacodegeeks.com/2012/08/gradle-custom-plugin.html