Gradle插件

如何應(yīng)用一個(gè)插件

應(yīng)用二進(jìn)制插件

  • 什么是二進(jìn)制插件

    • 二進(jìn)制插件就是實(shí)現(xiàn)了org.gradle.api.Plugin接口的插件,他們可以有plugin id
    • 二進(jìn)制插件一般都是被打包在一個(gè)jar里獨(dú)立發(fā)布的,比如我們自定義的插件
  • 實(shí)例

    • 代碼:

        apply from:'version.gradle'
        
        task ex52PrintlnTask << {
          println "App版本是:${versionName},版本號(hào)是:${versionCode}"
        }
      
    • version.gradle

        ext {
          versionName = '1.0.0'
          versionCode = 1
        }
      
    • 運(yùn)行結(jié)果:

        > Task :ex52PrintlnTask
        App版本是:1.0.0,版本號(hào)是:1

- 分析:
    - 其實(shí)這不算一個(gè)插件,它只是一個(gè)腳本;應(yīng)用腳本插件,其實(shí)就是把這個(gè)腳本加載進(jìn)來(lái),和二進(jìn)制插件不同的是它使用的是from關(guān)鍵字,后面緊跟是一個(gè)腳本文件,可以是本地的也可以是網(wǎng)絡(luò)的,如果是網(wǎng)絡(luò)的話(huà)要使用HTTPURL
    - 雖然它不是一個(gè)真正的插件,但不能忽視它的作用,它是腳本文件模塊化的基礎(chǔ),我們可以把龐大的腳本文件,進(jìn)行分塊、分段整理,拆分成一個(gè)共用、職責(zé)分明的文件
  • apply方法的其他用法

    • apply有三種使用方式

        void apply(Map<String,?> options);
        void apply(Closure closure);
        void apply(Action<? super ObjectConfigurationAction> action);
      
    • 閉包的方式如下:

        apply {
            plugin 'java'
        }
      
    • Action的方式:

        apply(new Action<ObjectConfigurationAction>(){
            @override
            void execute(ObjectConfigurationAction objectConfigurationAction){
                objectConfigurationAction.plugin('java)
            }   
        })
      
  • 應(yīng)用第三方發(fā)布的插件

          buildscript {
              repositories {
                  jcenter()
              }
              dependencies {
                  // gradle插件版本
                  classpath 'com.android.tools.build:gradle:3.0.0'
          
              }
          }
    
    • 分析:
      • buildscript{}塊是一個(gè)在構(gòu)建項(xiàng)目之前,為項(xiàng)目進(jìn)行前期準(zhǔn)備和初始化相關(guān)配置依賴(lài)的地方,配置好所需的依賴(lài),就可以應(yīng)用插件了:

          apply plugin:'com.android.application'
        
      • 如果沒(méi)有提前在buildscript里配置依賴(lài)的classpath,會(huì)提示找不到這個(gè)插件

  • 使用plugins DSL應(yīng)用插件

    • plugins DSL是一種新的插件應(yīng)用方式,Gradle 2.1以上版本才可以使用。目前這個(gè)功能還在內(nèi)測(cè)

         plugins {
            id 'java'
         }
      
    • 這樣就應(yīng)用了java插件,看著更簡(jiǎn)潔,符合DSL規(guī)范

    • 如果該插件已經(jīng)被托管在https://plugins.gradle.org/網(wǎng)站上,我們就不用再buildscript里配置classpath依賴(lài)了,直接使用plugins就可以應(yīng)用插件:

        plugins {
            id 'org.snoarqube' version '1.2'
        }
      
  • 自定義插件

    • 自定義插件必須要實(shí)現(xiàn)Plugin接口,這個(gè)接口只有一個(gè)apply方法,該方法在插件被應(yīng)用的時(shí)候執(zhí)行。所以我們可以實(shí)現(xiàn)這個(gè)方法,做我們想做的事情,比如這里創(chuàng)建一個(gè)名稱(chēng)為ex53CustomTask的任務(wù)給項(xiàng)目用

    • 實(shí)例:

        apply plugin:Ex53CustomPlugin
        class Ex53CustomPlugin implements Plugin<Project>{
            void apply(Project project){
                project.task('ex53CustomTask') << {
                    println "這是一個(gè)通過(guò)自定義插件方式創(chuàng)建的任務(wù)"
                }
            }
        }
      
    • 運(yùn)行結(jié)果:

        3$ gradle ex53
        Starting a Gradle Daemon (subsequent builds will be faster)
        
        > Task :ex53CustomTask
        這是一個(gè)通過(guò)自定義插件方式創(chuàng)建的任務(wù)
      
    • 以上是我們定義的一個(gè)簡(jiǎn)單的插件,是定義在build.gradle腳本里,只能是自己的項(xiàng)目使用

  • 創(chuàng)建一個(gè)Groovy工程,然后配置我們插件開(kāi)發(fā)所需的依賴(lài):

    • 實(shí)例:

        apply plugin:'Groovy'
        dependencies{
            compile gradleApi()
            compile localGroovy()
        }
        
        //然后實(shí)現(xiàn)插件類(lèi)
        package com.github.rujews.plugins
        import org.gradle.api.Plugin
        import org.gradle.api.Project
        class Ex53CustomPlugin implements Plugin<Project>{
            void apply(Project project){
                project.task('ex53CustomTask') << {
                    println "這是一個(gè)通過(guò)自定義插件方式創(chuàng)建的任務(wù)"
                }
            }
        }
      
    • 每一個(gè)插件都有一個(gè)唯一的Plugin ID,以供使用者使用,現(xiàn)在我們定義這個(gè)plugin id。Gradle

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 單通者非雙通亦非三通,《隋唐演義》英雄。吾聽(tīng)《隋唐》三次有余,獨(dú)慕其義,恨生不同時(shí)。故用此昵稱(chēng)。實(shí)對(duì)單英 雄之不敬...
    單通閱讀 990評(píng)論 0 0
  • 她是那樣一個(gè)好女孩,給我?guī)г顼垺?她是那樣棒的一個(gè)好女孩,跑這么遠(yuǎn)給我?guī)г顼垺?她豈止是那樣棒的一個(gè)好女孩,完全就...
    稻子黃了閱讀 1,020評(píng)論 8 14
  • 立德立言,無(wú)問(wèn)西東 影片中,我印象深刻的有三處蓮子糖水、晃晃、胎毛筆。 生活在這個(gè)和平的年代,我沒(méi)有辦法對(duì)身處戰(zhàn)亂...
    御影云朵閱讀 310評(píng)論 0 0
  • 早在去年的時(shí)候,就有朋友去了武功山,看到其發(fā)的朋友圈照片,日出云海,高山草甸,燦爛星空,自此便一直心心念念,心向往...
    Maggielxx閱讀 908評(píng)論 2 4

友情鏈接更多精彩內(nèi)容