從零開始學(xué)習(xí)Gradle之二---如何使用Task

          上一篇文章中,我們提到了Gradle的一些基本概念,如Project、Task以及Action,并且創(chuàng)建了我們的第一個Task。這次我們來看看Gradle中關(guān)于Project和Task的更多細(xì)節(jié)。

          1. Project和Task

          對于build.gradle配置文件,當(dāng)運(yùn)行Gradle <Task> 時,Gradle會為我們創(chuàng)建一個Project的對象,來映射build.gradle中的內(nèi)容。其中呢,對于不屬于任何Task范疇的代碼,Gradle會創(chuàng)建一個Script類的對象,來執(zhí)行這些代碼;對于Task的定義,Gradle會創(chuàng)建Task對象,并將它會作為project的屬性存在(實際上是通過getTaskName完成的)。ok,看一個簡單的例子:

          新建文件basic/build.gradle,然后加入如下部分代碼:

          println "the project name is $name"
          task hello << {
              println "the current task name is $name"
              println "hello world"
          }

          當(dāng)運(yùn)行這個例子時,首先Gradle會創(chuàng)建一個Porject的對象,然后將它和build.gradle的內(nèi)容映射起來。在這個例子中,project包括兩部分:
          1)可執(zhí)行腳本定義

             按照之前提到的,可執(zhí)行腳本的定義將直接被創(chuàng)建成對應(yīng)的Script類的對象
             在這個例子中,Script對應(yīng)的部分就是第一行println的部分,然后執(zhí)行的結(jié)果就是打印出 "the project name is basic"。
             默認(rèn)的,Project的名字是當(dāng)前build.gradle所在目錄的名字,在這個例子中,build.gradle放在basic目錄下,因此,project的name也就是basic.

          2)Task定義

            在這個例子中,Gradle將創(chuàng)建一個Task的實例,將其和定義的task內(nèi)容關(guān)聯(lián)起來。另外,按照之前所說的,當(dāng)Gradle運(yùn)行時,我們可以使用訪問project屬性的方式去訪問它。

          例如,這個例子中,我們可以使用project.hello來訪問這個task。因為這個task hello已經(jīng)成為project的一個屬性,那么當(dāng)我們使用gradle properties(properties是gradle自帶的一個Task,它能列出當(dāng)前project級別的所有屬性,可以使用gradle tasks查看更多內(nèi)建的Task)來獲取project級別的屬性列表時,也將會得到'hello'。

          另外,有一點要注意的是,在這個例子中,task中使用的$name,并不是Project的name,它是當(dāng)前Task的name,因為它被使用在Task的scope里。

          執(zhí)行Gradle hello,輸出的結(jié)果將是:

          current project name is test
          the current task name is hello
          hello world

          2. 定義屬性

          在Gradle中,我們可以定義以下三種屬性并使用它們:

          1)System Properties

          System Properties 實際是指的JVM的system properties。我們知道,在運(yùn)行java程序時,可以使用-D來設(shè)置Java的系統(tǒng)變量,在Gradle中,你也可以做同樣的事情。比如

          gradle xxx -DmySystemProp=xxxx

          同時,在build.gradle中,應(yīng)該這樣使用這個變量:

          task printSysProps << {
            println System.properties['system']
          }

          2)Project Properties 

          Project Properties是Gradle專門為Project定義的屬性。它的最大優(yōu)點在于當(dāng)運(yùn)行g(shù)radle的時候,我們可以使用-P來設(shè)置它的值。比如,

          gradle xxx -PmyProjectProp=xxxxx

          而在build.gradle中,可以這樣使用這個變量: 

          task printProps << {
              if (project.hasProperty('commandLineProjectProp')) {  
                  println commandLineProjectProp
              }  
          }
          同時,當(dāng)我們執(zhí)行g(shù)radle properties查看屬性列表時,這個變量的名稱以及值會顯示在結(jié)果中。

          3)Ext(ra) Properties

              另外,我們還可以為Project或者Task定義Ext屬性,也稱動態(tài)屬性,我們必須使用關(guān)鍵字ext(對應(yīng)ExtraPropertiesExtension的實例)去定義動態(tài)屬性。從這點可以看出,Gradle已經(jīng)為我們設(shè)計了很多不同的類,去做不同的事情,我們只需要遵循Convention,使用他們即可。如果忘記寫ext關(guān)鍵字,gradle運(yùn)行時則會提示:

          "Dynamic properties are deprecated...."。這是因為以前版本的gradle定義動態(tài)屬性時,不需要加ext關(guān)鍵字的。

          對于Project和Task而言,動態(tài)屬性定義的方式完全一樣,只是作用域不一樣。
          當(dāng)定義完成后,我們就可以使用project.prop 或者 task.prop來訪問這些動態(tài)屬性了。下面讓我們看一個例子: 

          ext.projectProperties="ext projectProperties-value"
          task printExtProps << {
            ext.taskProperties="ext.task.properties-value"
            if (project.hasProperty('projectProperties')){
              println "ext.projectProperties values is " + projectProperties  
            }
            if (printExtProps.hasProperty('taskProperties')){
              println "task has defined ext.taskProperties value is " + taskProperties  
            }
          }

          注意:對于ext定義的動態(tài)屬性,并不能通過外部的方式修改它的值,只能在build.gradle中去設(shè)置或者修改它的值。

          同時,如果是為project定義的ext動態(tài)屬性,也會顯示在gradle properties的結(jié)果中。

          3. Task依賴

          當(dāng)構(gòu)建一個復(fù)雜的項目時,不同task之間存在依賴是必然的。比如說,如果想運(yùn)行'部署'的task,必然要先運(yùn)行 編譯、打包、檢測服務(wù)器等task,只有當(dāng)這被些被依賴的task執(zhí)行完成后,才會部署。對于這種行為之間的依賴,Ant、Maven都提供了聲明式的定義,非常簡單。同樣,使用Gradle定義task之間的依賴也是件很容易的事。

          例如,定義如下兩個Task,并且在"intro"里加上"dependendsOn"的關(guān)鍵字,如下所示:

          task hello << {
              println 'Hello world!'
          }
          task intro(dependsOn: hello) << {
              println "I'm Gradle" 
          }
          執(zhí)行 "gradle intro",結(jié)果將是:
          Hello World
          I'm Gradle

          由此可見,當(dāng)執(zhí)行g(shù)radle intro時,intro依賴的task hello會先被執(zhí)行。除此之外,dependensOn也支持定義多個task的依賴,使用[]括起來即可。例如

          task A(dependensOn:['B','C','D']) <<{ xxx }

          除了使用dependensOn跟字符串來定義依賴,我們也可以使用taskX.dependensOn taskY這種形式:

          task taskX << {
              println 'taskX'
          }
          task taskY << {
              println 'taskY'

          taskX.dependsOn taskY

          或者,也可以使用閉包:

          task taskX << {
              println 'taskX'
          }
          taskX.dependsOn {
              tasks.findAll { task -> task.name.startsWith('lib') }
          }
          task lib1 << {
              println 'lib1'
          }

          除了之前講的task的部分,Gradle還為我們提供了很多可用的API,更多的細(xì)節(jié)大家可以參考下Gradle的文檔。這里我列出一個常用的方法onlyIf。在Gradle里,我們可以使用“OnlyIf()”來決定當(dāng)前task是否需要被執(zhí)行,例如:新建build.gradle,加入如下代碼:

          task hello << {
              println 'hello world'

          hello.onlyIf { !project.hasProperty('skipHello') }

          當(dāng)我們直接執(zhí)行"gradle hello"時,沒有任何結(jié)果,當(dāng)我們執(zhí)行"gradle hello -PskipHello=xxxx"時,會輸出"hello world"。

          4. 總結(jié)
          OK.今天對gradle的總結(jié)到此為止。總體而言,用DSL的代碼而不是xml來定義構(gòu)建的過程,還是很fancy的。

          posted on 2012-07-05 13:42 想飛就飛 閱讀(51341) 評論(3)  編輯  收藏 所屬分類: J2EEGroovy/Grails

          評論

          # re: 從零開始學(xué)習(xí)Gradle之二---如何使用Task 2013-05-27 18:19 BLUEBLUE

          task hello << {
          println 'hello world'
          }
          hello.onlyIf { !project.hasProperty('skipHello') }
          當(dāng)我們直接執(zhí)行"gradle hello"時,沒有任何結(jié)果,當(dāng)我們執(zhí)行"gradle hello -PskipHello=xxxx"時,會輸出"hello world"。
          反掉了吧,沒有該屬性的時候,才會打印hello world.也就是說直接執(zhí)行“gradle hello”時,會輸出hello world  回復(fù)  更多評論   

          # re: 從零開始學(xué)習(xí)Gradle之二---如何使用Task 2014-05-30 12:15 啦啦

          恩,寫反了!@BLUEBLUE
            回復(fù)  更多評論   

          # re: 從零開始學(xué)習(xí)Gradle之二---如何使用Task 2016-02-17 01:31 Mars Liu

          感謝,O'reilly 的 build and testing with gradle 中 dynamic property 的說明已經(jīng)過時,在這里查到了正確的方式。  回復(fù)  更多評論   

          公告


          導(dǎo)航

          <2016年2月>
          31123456
          78910111213
          14151617181920
          21222324252627
          282912345
          6789101112

          統(tǒng)計

          常用鏈接

          留言簿(13)

          我參與的團(tuán)隊

          隨筆分類(69)

          隨筆檔案(68)

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 监利县| 车险| 桂林市| 财经| 诸暨市| 德化县| 巩留县| 博野县| 灵宝市| 丰城市| 马山县| 驻马店市| 广昌县| 晋江市| 建德市| 台北市| 和田县| 洪湖市| 法库县| 华亭县| 昂仁县| 偃师市| 普兰县| 繁昌县| 瑞丽市| 满城县| 灵宝市| 隆昌县| 和顺县| 陆川县| 霍城县| 石台县| 昌邑市| 连州市| 郴州市| 新蔡县| 成都市| 广宁县| 大悟县| 清流县| 玉龙|