gradle 插件 自定义_Gradle自定义插件
gradle 插件 自定義
本教程介紹了創(chuàng)建Gradle獨(dú)立自定義插件的方法。 它涵蓋以下主題- 創(chuàng)建任務(wù),并在“自定義”插件中使用
- 獨(dú)立的自定義插件
- 簡(jiǎn)短的插件ID
- 使用settings.gradle自定義Gradle設(shè)置
項(xiàng)目信息:
Gradle版本:1.1
操作系統(tǒng)平臺(tái):Ubuntu 12.10 先決條件:基本了解Gradle腳本。
創(chuàng)建獨(dú)立的自定義插件
這里的插件目錄包含所有源代碼和資源文件,而用戶目錄包含使用自定義插件的使用者腳本。 執(zhí)行以下命令以創(chuàng)建目錄結(jié)構(gòu)。 這里的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每個(gè)插件都應(yīng)該有一個(gè)實(shí)現(xiàn)類來(lái)擴(kuò)展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任務(wù)已定義為打印一條簡(jiǎn)單的線。
為了應(yīng)用插件,我們通常使用一個(gè)簡(jiǎn)短的ID,例如apply plugin:'java'。 這里的“ java”是org.gradle.api.plugins.JavaPlugin類的簡(jiǎn)短插件ID。 簡(jiǎn)短的插件ID可以通過(guò)簡(jiǎn)單的步驟進(jìn)行定義。 為此,我們需要?jiǎng)?chuàng)建一個(gè)屬性文件,并將其放在類路徑下的META-INF / gradle-plugins目錄中。 文件名將是我們的短ID。 該屬性文件必須包含以下所示的行,并且應(yīng)指向插件實(shí)現(xiàn)類。 讓我們將屬性文件創(chuàng)建為code4reference.properties并將其指向Code4ReferencePlugin類。
implementation-class=com.code4reference.gradle.Code4ReferencePlugin為了編譯和構(gòu)建此插件,我們將編寫gradle腳本。 在插件目錄中創(chuàng)建名為build.gradle的文件, 然后在其中復(fù)制下面的內(nèi)容。
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聲明為編譯時(shí)間依賴項(xiàng)。 您可能已經(jīng)注意到我們使用了maven插件。 它基本上會(huì)創(chuàng)建插件jar文件并將其存儲(chǔ)在maven存儲(chǔ)庫(kù)中。 在這里,我們?cè)诟改夸浿袆?chuàng)建名為repo的Maven存儲(chǔ)庫(kù),并將jar文件存儲(chǔ)在其中。
當(dāng)執(zhí)行以上命令時(shí),gradle會(huì)從settings.gradle中獲取項(xiàng)目名稱。 如果當(dāng)前目錄中不存在settings.gradle文件,則它將獲取當(dāng)前目錄的名稱并將其假定為項(xiàng)目名稱。 然后,它形成存儲(chǔ)jar文件的路徑。 文件路徑約定如下/group/name/projectName/version/projectname-version-timestamp.jar 。 您可能會(huì)在上面的輸出中注意到,jar路徑名和jar文件名帶有插件字,因?yàn)楫?dāng)前目錄名是plugin,而gradle將其假定為項(xiàng)目名。 如果要覆蓋此屬性,并將code4ReferencePlugin作為項(xiàng)目名稱,則需要在插件目錄中創(chuàng)建settings.gradle文件,并放入下一行。
rootProject.name = 'code4ReferencePlugin'現(xiàn)在再次執(zhí)行命令以生成插件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現(xiàn)在問(wèn)題解決了。 該jar的名稱為code4ReferencePlugin- [version] -timestamp.jar。 如果要查找有關(guān)gradle和系統(tǒng)屬性的更多信息,請(qǐng)?jiān)诖颂幷业健?
使用自定義插件
這確實(shí)是一個(gè)簡(jiǎn)單的步驟。 盡管我們使用其他插件,但是自定義插件也可以類似的方式使用。 現(xiàn)在在用戶目錄中創(chuàng)建另一個(gè)build.gradle文件,并復(fù)制下面給出的代碼。
buildscript {repositories {maven {url uri('../repo')}}dependencies {classpath group: 'com.code4reference',name: 'code4ReferencePlugin',version: '1.1-SNAPSHOT'} } apply plugin: 'code4reference'build.gradle腳本訪問(wèn)父目錄中存在的Maven存儲(chǔ)庫(kù)。 我們還定義了依賴關(guān)系,該依賴關(guān)系基本上是從Maven訪問(wèn)jar文件的特定版本。 最后但并非最不重要的一點(diǎn)是,我們應(yīng)用簡(jiǎn)短的插件ID“ code4reference”。 要運(yùn)行此gradle腳本,請(qǐng)?jiān)?strong>用戶目錄中的終端上執(zhí)行以下命令。
$ 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 secsVoilà! 您剛剛創(chuàng)建了自定義插件,并在其他項(xiàng)目腳本中使用了它。 您可以在此處找到本教程的源代碼。 Code4參考
現(xiàn)在,將涵蓋以下主題。
- 定義自定義任務(wù)類
- 將參數(shù)傳遞給自定義插件任務(wù)
- 嵌套參數(shù)
- 測(cè)試自定義插件
項(xiàng)目信息:
項(xiàng)目名稱:Gradle自定義插件
Gradle版本:1.1 操作系統(tǒng)平臺(tái):Ubuntu 12.10 先決條件:基本了解Gradle腳本。
在這里,我們將遵循第一部分中列出的相同目錄層次結(jié)構(gòu)。
讓我們定義一個(gè)名為Code4ReferenceTask的自定義類,該類擴(kuò)展了DefaultTask類,并將此文件放在保存Code4ReferencePlugin.groovy的同一文件夾中。 此類包含一個(gè)名為showMessage()的方法,該方法使用@TaskAction進(jìn)行注釋。 執(zhí)行任務(wù)時(shí),Gradle會(huì)調(diào)用此方法。
package com.code4reference.gradle;import org.gradle.api.DefaultTask import org.gradle.api.tasks.TaskActionclass Code4ReferenceTask extends DefaultTask {@TaskActiondef showMessage() {println '----------showMessage-------------'} }現(xiàn)在,我們需要在Code4ReferencePlugin.groovy中進(jìn)行一些小的修改,以包含自定義任務(wù)。 修改后的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)} }您可能會(huì)注意到,與過(guò)去的實(shí)現(xiàn)相比,只有突出顯示的行已更改。 現(xiàn)在,“ c4rTask”是Code4ReferenceTask類型的。 在插件目錄中執(zhí)行gradle uploadArchives命令。 這將更新Maven存儲(chǔ)庫(kù)中的jar文件。 現(xiàn)在,使用相同的舊build.gradle在用戶目錄中執(zhí)行以下命令。 我們將獲得以下輸出。
$gradle c4rTask :c4rTask ----------showMessage------------- BUILD SUCCESSFULTotal time: 14.057 secs上面的實(shí)現(xiàn)是最簡(jiǎn)單的,并沒(méi)有做很多事情。 如果我們想將Gradle腳本的參數(shù)傳遞給該任務(wù)怎么辦? 我們可以通過(guò)訪問(wèn)擴(kuò)展對(duì)象來(lái)實(shí)現(xiàn)。 Gradle項(xiàng)目具有關(guān)聯(lián)的ExtensionContainer對(duì)象,該對(duì)象有助于跟蹤傳遞給plugins類的所有設(shè)置和屬性。 讓我們定義一個(gè)擴(kuò)展類,它可以容納參數(shù)并將其傳遞給Task類。 Code4ReferencePlugin類中突出顯示的行有助于將參數(shù)傳遞給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類,其中包含兩個(gè)變量message和sender。 這些用作自定義任務(wù)的參數(shù)。 我們需要修改Code4RefernceTask類以訪問(wèn)參數(shù)。 高亮顯示的行已添加到以前的Code4ReferenceTask類實(shí)現(xiàn)中。
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}'} }在插件目錄中執(zhí)行gradle uploadArchives命令。 這將更新Maven存儲(chǔ)庫(kù)中的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 !!!!' }您可能已經(jīng)注意到,已經(jīng)添加了c4rArgs閉包,并且在閉包中設(shè)置了發(fā)件人和消息變量。 這兩個(gè)變量可以在showMessage()方法中訪問(wèn)。 現(xiàn)在運(yùn)行用戶目錄中存在的build.gradle。 我們得到以下輸出。
$gradle c4rTask :c4rTask -------------------------showMessage----------------------------- From : Rakesh, message : Hello there !!!!BUILD SUCCESSFULTotal time: 15.817 secs如果我們想傳遞嵌套參數(shù)怎么辦? 我們可以通過(guò)嵌套擴(kuò)展對(duì)象來(lái)實(shí)現(xiàn)。 這是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)} }現(xiàn)在也該修改Code4ReferenceTask類。 在此類中添加了突出顯示的行,以訪問(wèn)嵌套的參數(shù)。
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}'} }在插件目錄中再次執(zhí)行gradle uploadArchives命令以更新Maven存儲(chǔ)庫(kù)中的jar文件。 現(xiàn)在,修改用戶目錄中存在的build.gradle文件以傳遞嵌套參數(shù)。
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'} }我們?cè)赽uild.gradle文件中添加了突出顯示的行。
代碼測(cè)試是代碼開(kāi)發(fā)的重要方面。 現(xiàn)在,我們將為自定義任務(wù)和插件添加單元測(cè)試。 為此,我們需要為測(cè)試類創(chuàng)建目錄結(jié)構(gòu)。 我們需要將測(cè)試文件夾放在src目錄中。 在插件目錄中執(zhí)行以下命令以創(chuàng)建測(cè)試目錄。
$mkdir -p src/test/groovy/com/code4reference/gradle/測(cè)試目錄結(jié)構(gòu)遵循用于源代碼包目錄的相同包目錄結(jié)構(gòu)。 在此目錄中,放入Code4ReferencePlugin和Code4ReferenceTask的測(cè)試類。 在測(cè)試類中,ProjectBuilder用于訪問(wèn)項(xiàng)目對(duì)象。 這些測(cè)試用例易于編寫,類似于Junit測(cè)試用例。 測(cè)試類的代碼如下:
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)} }要運(yùn)行測(cè)試,請(qǐng)?jiān)趐lugin文件夾中執(zhí)行以下命令。
$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 FAILEDGradle測(cè)試提供了測(cè)試報(bào)告及其位置。 可以使用任何瀏覽器打開(kāi)該文件來(lái)檢查堆棧跟蹤。
您可以在此處找到源代碼 。
參考: Gradle自定義插件(第1部分) , ? 我們的JCG合作伙伴 Rakesh Cusat的Gradle自定義插件(第2部分)來(lái)自Code4Reference博客。
翻譯自: https://www.javacodegeeks.com/2012/08/gradle-custom-plugin.html
gradle 插件 自定義
總結(jié)
以上是生活随笔為你收集整理的gradle 插件 自定义_Gradle自定义插件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怎么连接路由器如何教接路由器
- 下一篇: 使用笔记本电脑怎样打印资料如何使用电脑打