<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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

    1. Project和Task

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

    新建文件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)行這個(gè)例子時(shí),首先Gradle會(huì)創(chuàng)建一個(gè)Porject的對(duì)象,然后將它和build.gradle的內(nèi)容映射起來。在這個(gè)例子中,project包括兩部分:
    1)可執(zhí)行腳本定義

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

    2)Task定義

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

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

    另外,有一點(diǎn)要注意的是,在這個(gè)例子中,task中使用的$name,并不是Project的name,它是當(dāng)前Task的name,因?yàn)樗皇褂迷赥ask的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 實(shí)際是指的JVM的system properties。我們知道,在運(yùn)行java程序時(shí),可以使用-D來設(shè)置Java的系統(tǒng)變量,在Gradle中,你也可以做同樣的事情。比如

    gradle xxx -DmySystemProp=xxxx

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

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

    2)Project Properties 

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

    gradle xxx -PmyProjectProp=xxxxx

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

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

    3)Ext(ra) Properties

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

    "Dynamic properties are deprecated...."。這是因?yàn)橐郧鞍姹镜膅radle定義動(dòng)態(tài)屬性時(shí),不需要加ext關(guān)鍵字的。

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

    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  
      }
    }

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

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

    3. Task依賴

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

    例如,定義如下兩個(gè)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時(shí),intro依賴的task hello會(huì)先被執(zhí)行。除此之外,dependensOn也支持定義多個(gè)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的文檔。這里我列出一個(gè)常用的方法onlyIf。在Gradle里,我們可以使用“OnlyIf()”來決定當(dāng)前task是否需要被執(zhí)行,例如:新建build.gradle,加入如下代碼:

    task hello << {
        println 'hello world'

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

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

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

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

    評(píng)論

    # 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"時(shí),沒有任何結(jié)果,當(dāng)我們執(zhí)行"gradle hello -PskipHello=xxxx"時(shí),會(huì)輸出"hello world"。
    反掉了吧,沒有該屬性的時(shí)候,才會(huì)打印hello world.也就是說直接執(zhí)行“gradle hello”時(shí),會(huì)輸出hello world  回復(fù)  更多評(píng)論   

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

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

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

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

    公告


    導(dǎo)航

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

    統(tǒng)計(jì)

    常用鏈接

    留言簿(13)

    我參與的團(tuán)隊(duì)

    隨筆分類(69)

    隨筆檔案(68)

    最新隨筆

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 久久99热精品免费观看牛牛| 四虎影在线永久免费四虎地址8848aa| 国产免费av一区二区三区| 午夜亚洲国产理论秋霞| 日韩在线观看免费| 国内外成人免费视频| 久久亚洲精品无码VA大香大香| 日韩毛片免费一二三| 成人毛片免费在线观看| 91在线亚洲精品专区| 国产成人免费AV在线播放| 亚洲精品高清在线| 亚洲av永久中文无码精品 | 国产精品亚洲玖玖玖在线观看| 久久精品国产亚洲αv忘忧草| 久99久精品免费视频热77| 国内精品久久久久久久亚洲| 亚洲AV无码一区二区三区久久精品 | 亚洲国产人成在线观看| 爱丫爱丫影院在线观看免费| 亚洲国产精品无码久久久久久曰| 亚洲自偷自偷在线成人网站传媒| 99视频在线看观免费| 久久亚洲精品成人| 中文字幕乱码系列免费| 亚洲欧洲自拍拍偷精品 美利坚| 久久亚洲精品高潮综合色a片| 噼里啪啦电影在线观看免费高清| 91亚洲导航深夜福利| 日本在线免费观看| 精品久久久久久亚洲| 一级做a爰片久久毛片免费看| 国产精品无码一二区免费| 伊人久久五月丁香综合中文亚洲 | 久久青草91免费观看| 久久亚洲综合色一区二区三区 | 四虎影视在线看免费观看| 国产一区二区三区无码免费| 亚洲精品女同中文字幕| 成人免费男女视频网站慢动作| 亚洲人成网站日本片|