gradle自定義任務和外掛

夕陽下的奔跑發表於2019-10-21
  1. 定製任務的不同方式

gradle自定義任務和外掛

  1. 方式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. 實現一個物件外掛的幾種選擇:

gradle自定義任務和外掛

  1. 用方式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

  2. 外掛擴充套件機制

    在跟目錄的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。

  3. 被用來擴充套件一個物件的DSL的擴充套件是擴充套件可知的。一個已註冊的擴充套件模型會暴露一些屬性和方法,用來給構建指令碼建立新的構建語言結構。額外屬性是通過ext名稱空間建立的簡單變數,一般提供給構建指令碼使用。儘量避免在外掛中使用額外屬性。

  4. 外掛定義名稱——用名稱代替全限定類名

    在buildSrc/src/main下建立resources目錄,再建立META-INF/gradle-plugins/,再建立mplugin.properties檔案並賦值:implementation-class=com.hero.test.MPlugin

    在根目錄中引用外掛apply plugin: 'mplugin'

  5. 開發和使用獨立的物件外掛

    1. 專案和倉庫配置

      在專案下建立plugin專案,並將buildSrc下的檔案拷貝過來

    2. 構建外掛專案

      專案不需要再訪問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")
              }
          }
      }
      複製程式碼
    3. 在plugin目錄下執行gradle uploadArchives命令,在repo目錄下可以看到mplugin的jar和pom檔案

    4. 在根目錄中使用mplugin

      apply plugin: 'mplugin'
      
      buildscript {
          repositories {
          	//本地maven倉庫地址,即repo路徑
              maven {
                  url "file://$projectDir/repo"
              }
              mavenCentral()
          }
      
          dependencies {
          	//定義對mplugin的依賴
              classpath 'com.hero.test:mplugin:1.0'
          }
      }
      複製程式碼

相關文章