- 定製任務的不同方式
-
方式2定製task
在根目錄下建立buildSrc/src/main/groovy/com/hero/test/資料夾,並建立MTask.groovy
package com.hero.test import org.gradle.api.* import org.gradle.api.tasks.* class MTask extends DefaultTask { //此處不要定義變數名為name @Input String aa; @Input int num; MTask(){ description = 'hello' group = 'test' } @TaskAction void start(){ logger.quiet "name:$aa , num:$num" } } 複製程式碼
在跟目錄的build.gradle中使用這個task
import com.hero.test.MTask //匯入自定義的task task test(type: MTask){ //配置輸入和輸出 aa = "hero" num = 19 } 複製程式碼
-
實現一個物件外掛的幾種選擇:
-
用方式2實現一個外掛
在buildSrc/main/groovy/com/hero/test/下新建MPlugin.groovy
package com.hero.test import org.gradle.api.Plugin import org.gradle.api.Project import com.hero.test.MTask class MPlugin implements Plugin<Project> { @Override void apply(Project project){ //新增一個task,並配置了輸入和輸出 project.task('plugintask',type: MTask) { aa = 'sss' num = 33 } } } 複製程式碼
使用gradle tasks可以檢視task
使用gradle plugintask可以執行該task
-
外掛擴充套件機制
在跟目錄的build.gradle中定義一個擴充套件屬性的閉包
apply plugin: com.hero.test.MPlugin mext { aa = 'test' num = 222 } 複製程式碼
定義一個外掛擴充套件的物件,/buildSrc/src/main/groovy/com/hero/test/Ext.groovy
package com.hero.test class Ext{ String aa; int num; } 複製程式碼
在外掛中註冊和使用擴充套件屬性
package com.hero.test import org.gradle.api.Plugin import org.gradle.api.Project import com.hero.test.MTask import com.hero.test.Ext class MPlugin implements Plugin<Project> { @Override void apply(Project project){ //註冊擴充套件容器,與build.gradle中的閉包同名 project.extensions.create('mext', Ext) //查詢已配置的屬性 def extension = project.extensions.findByName('mext') project.task('plugintask',type: MTask) { //將包裝在閉包中的擴充套件屬性賦給task的約定對映 conventionMapping.aa = { extension.aa } conventionMapping.num = { extension.num } } } } 複製程式碼
在task中獲取配置值
package com.hero.test import org.gradle.api.* import org.gradle.api.tasks.* class MTask extends DefaultTask { @Input String aa; @Input int num; MTask(){ description = 'hello' group = 'test' } @TaskAction void start(){ //需要使用getter獲取值,直接使用是null值 String a = getAa() String n = getNum() logger.quiet "name:$a , num:$n" } } 複製程式碼
約定對映:外掛中的每個task都有一個名字是conventionMapping的屬性。每個從DefaultTask繼承而來的task都擁有這個屬性。使用這個屬性將擴充套件模型的值賦給task的輸入或者輸出欄位。通過將擴充套件模型值包裝成一個閉包,實現惰性賦值。意味著這個值只有當task執行時才會被計算。為了獲取儲存在約定對映中的屬性值,需要顯式地使用getter方法,否則會返回null。
-
被用來擴充套件一個物件的DSL的擴充套件是擴充套件可知的。一個已註冊的擴充套件模型會暴露一些屬性和方法,用來給構建指令碼建立新的構建語言結構。額外屬性是通過ext名稱空間建立的簡單變數,一般提供給構建指令碼使用。儘量避免在外掛中使用額外屬性。
-
外掛定義名稱——用名稱代替全限定類名
在buildSrc/src/main下建立resources目錄,再建立META-INF/gradle-plugins/,再建立mplugin.properties檔案並賦值:implementation-class=com.hero.test.MPlugin
在根目錄中引用外掛apply plugin: 'mplugin'
-
開發和使用獨立的物件外掛
-
專案和倉庫配置
在專案下建立plugin專案,並將buildSrc下的檔案拷貝過來
-
構建外掛專案
專案不需要再訪問buildSrc的程式碼,需要定義對Groovy和Gradle API類庫的依賴。通過Maven外掛,可以非常容易地為外掛生成POM檔案和將工件釋出到Maven倉庫。需要配置Maven部署器將POM檔案和工件上傳到本地目錄。需要指定外掛的group,name和version
apply plugin: 'groovy' apply plugin: 'maven' //外掛名稱,group,version archivesBaseName = 'mplugin' group = 'com.hero.test' version = '1.0' repositories { mavenCentral() } dependencies { compile localGroovy() compile gradleApi() } uploadArchives { repositories { mavenDeployer { //將外掛上傳到本地的repo目錄 repository(url: "file://$projectDir/../repo") } } } 複製程式碼
-
在plugin目錄下執行gradle uploadArchives命令,在repo目錄下可以看到mplugin的jar和pom檔案
-
在根目錄中使用mplugin
apply plugin: 'mplugin' buildscript { repositories { //本地maven倉庫地址,即repo路徑 maven { url "file://$projectDir/repo" } mavenCentral() } dependencies { //定義對mplugin的依賴 classpath 'com.hero.test:mplugin:1.0' } } 複製程式碼
-