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

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

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

    從零開始學(xué)習(xí)Gradle之三---多項目構(gòu)建

     

       隨著信息化的快速發(fā)展,IT項目變得越來越復(fù)雜,通常都是由多個子系統(tǒng)共同協(xié)作完成。對于這種多系統(tǒng)、多項目的情況,很多構(gòu)建工具都已經(jīng)提供了不錯的支持,像maven、ant。Gradle除了借鑒了ant或者maven的繼承的方式定義子項目,也提供了一種更為方便的集中配置的方式,大大減少了構(gòu)建帶來的復(fù)雜度。除此之外,Gradle還提供了清晰的Project樹模型來映射多項目的組織結(jié)構(gòu)。下面,讓我們了解一下如何使用Gradle構(gòu)建多項目。

     

    1. 多項目定義及結(jié)構(gòu)

     在Gradle中,使用文件settings.gradle定義當(dāng)前項目的子項目,格式如下所示: 

    include 'sub-project1', 'sub-project2', 'sub-project3',

    它表示在當(dāng)前的項目下建立三個子項目,分別為'sub-project1', 'sub-project2', 'sub-project3'。默認情況下,每個子項目的名稱對應(yīng)著當(dāng)前操作系統(tǒng)目錄下的一個子目錄。

    當(dāng)Gradle運行時,會根據(jù)settings.gradle的配置情況,構(gòu)建一個單根節(jié)點的項目樹。其中的每個子節(jié)點代表一個項目(Project),每個項目都有一個唯一的路徑表示它在當(dāng)前樹中的位置,路徑的定義方式類似:

    Root:<Level1-子節(jié)點>:<Level2-子節(jié)點>:<Level3-子節(jié)點>

    也可以簡寫成“:<Level1-子節(jié)點>:<Level2-子節(jié)點>:<Level3-子節(jié)點>”。借助這種路徑的定義方式,我們可以在build.gradle去訪問不同的子項目。另外,對于單項目,實際上是一種特殊的、只存在根節(jié)點,沒有子節(jié)點的項目樹。

    例如,我們有個產(chǎn)品A,包括以下幾個組件core,web,mobile。分別代表"核心邏輯"、"網(wǎng)站"、“手機客戶端”。 因為每個組件是獨立的部分,這個時候最好我們能定義多個子項目,讓每個子項目分別管理自己的構(gòu)建。于是我們可以這樣定義A/settings.gradle

    include 'core', 'web', 'mobile'

    按照之前描述的,core組件對應(yīng)A/core目錄,web組件對應(yīng)A/web目錄,mobile組件對應(yīng)A/mobile目錄。接下來,我們就可以在每個組件內(nèi)部,定義build.gradle負責(zé)管理當(dāng)前組件的構(gòu)建。

    Gradle提供了一個內(nèi)建的task 'gradle projects',可以 幫助我們查看當(dāng)前項目所包含的子項目,下面讓我們看看gradle projects的輸出結(jié)果:

    $ gradle projects
    :projects
    ------------------------------------------------------------
    Root project
    ------------------------------------------------------------
    Root project 'A'
    +--- Project ':core'
    +--- Project ':mobile'
    \--- Project ':web

    結(jié)果一目了然,首先是Root級別的項目A,然后是A下面的子項目'core', 'mobile', 'mobile'

    最終的文件以及目錄結(jié)構(gòu)如下所示:

    A
       --settings.gradle
       --build.gradle
       --core
         --build.gradle
       --web
          --build.gradle
       --mobile
          --build.gradle

    如果你不喜歡這種默認的結(jié)構(gòu),也可以按照如下方式定義子項目的名稱和物理目錄結(jié)構(gòu):

    include(':core)
    project(':core').projectDir = new File(settingsDir, 'core-xxx') 

    include(':web)
    project(':web').projectDir = new File(settingsDir, 'web-xxx') 

    include(':mobile)
    project(':mobile').projectDir = new File(settingsDir, 'mobile-xxx') 

    在這個例子中,子項目core實際上對應(yīng)的物理目錄為A/core-xxx,web實際上對應(yīng)的是A/web-xxx,mobile也類似。

    雖然我們更改了子項目的物理目錄結(jié)構(gòu),不過由于我們在build.gradle中使用的是類似 “ :<SubProject>”的方式訪問對應(yīng)的子項目,所以目錄結(jié)構(gòu)的改變,對我們Gradle的構(gòu)建腳本并不會產(chǎn)生影響。

    接下來,考慮一個更復(fù)雜的情況,隨著產(chǎn)品的發(fā)展,mobile這個組件慢慢的劃分成了Android和IOS兩個部分,這時我們只需要在目錄A/mobile下定義新的settings.gradle,并加入如下部分:

    include 'android', 'ios'

    現(xiàn)在,mobile組件下將存在兩個新的子項目 "android"和"ios"

    于是,這時候'gradle projects'的目錄結(jié)構(gòu)就變成

    A
       --settings.gradle
       --core
          --build.gradle
       --web
          --build.gradle
       --mobile
          --settings.gradle
          --ios
            --build.gradle
          --android
            --build.gradle

    2. 多項目的集中配置

    對于大多數(shù)構(gòu)建工具,對于子項目的配置,都是基于繼承的方式。Gradle除了提供繼承的方式來設(shè)置子項目,還提供了另外一種集中的配置方式,方便我們統(tǒng)一管理子項目的信息。下面看一個例子,打開A/build.gradle,輸入如下部分:

    allprojects {
        task hello << {task -> println "I'm $task.project.name" }
    }
    subprojects {
        hello << {println "- I am the sub project of A"}
    }
    project(':core').hello << {
          println "- I'm the core component and provide service for other parts."
    }

    對于上面所示的代碼,已經(jīng)很表意了:

    allprojects{xxx}  這段代碼表示,對于所有的project,Gradle都將定義一個名稱是hello的Task { println "I'm $task.

    subprojects{xxxx}的這段代碼表示,對于所有的子project,將在名稱為hello的Task上追加Action {println "- I am the sub project of A"}

    注意:關(guān)于Task和Action的關(guān)系,請看我之前寫的本系列的第一部分。

    project(':core')的這段代碼表示,對于名稱為core的project,將在名稱為hello的Task上追加Action { println "- I'm the core component and provide service for other parts." }


    3. 多項目的Task執(zhí)行

    之前我們已經(jīng)了解了多項目的結(jié)構(gòu)以及如何通過路徑去訪問子項目。現(xiàn)在讓我們看看如何使用Gradle來執(zhí)行多項目。

    在Gradle中,當(dāng)在當(dāng)前項目上執(zhí)行g(shù)radle <Task>時,gradle會遍歷當(dāng)前項目以及其所有的子項目,依次執(zhí)行所有的同名Task,注意:子項目的遍歷順序并不是按照setting.gradle中的定義順序,而是按照子項目的首字母排列順序。

    基于剛才的例子,如果我們在根目錄下,執(zhí)行g(shù)radle hello,那么所有子項目的“hello” Task都會被執(zhí)行。如果我們在mobile目錄下執(zhí)行g(shù)radle hello,那么mobile、android以及IOS的“hello” Task都會被執(zhí)行。關(guān)于該例子的運行結(jié)果,這里就不貼出來了。大家如果有興趣的話可以試試。

    4. 總結(jié)
    這篇文章主要描述了使用Gradle管理多項目的知識。相比Ant或者Maven,Gradle提供了更靈活的配置方式。更重要的是,Gradle還提供了很多內(nèi)建的Task幫助我們查看或者管理項目。這次就先聊到這里,下次我們來看看Gradle的生命周期。

    posted on 2012-07-12 21:33 想飛就飛 閱讀(29963) 評論(2)  編輯  收藏 所屬分類: Groovy/Grails

    評論

    # re: 從零開始學(xué)習(xí)Gradle之三---多項目構(gòu)建 2014-05-30 17:45 啦啦

    后面什么情況,沒更新了啊?  回復(fù)  更多評論   

    # re: 從零開始學(xué)習(xí)Gradle之三---多項目構(gòu)建 2014-05-30 18:32 繁星之海

    更新...  回復(fù)  更多評論   

    公告


    導(dǎo)航

    <2012年7月>
    24252627282930
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    統(tǒng)計

    常用鏈接

    留言簿(13)

    我參與的團隊

    隨筆分類(69)

    隨筆檔案(68)

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲伊人久久综合影院| 免费v片在线观看品善网| 99久久99这里只有免费费精品 | 成人毛片免费播放| 亚洲综合最新无码专区| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 国产精品免费视频网站| 久久久久无码精品亚洲日韩| 亚洲乱亚洲乱妇24p| 丝袜捆绑调教视频免费区| 在线v片免费观看视频| 亚洲精品高清无码视频| 亚洲人成自拍网站在线观看| 我想看一级毛片免费的| 亚洲av成人一区二区三区观看在线| 中文字幕无码免费久久| 国产乱人免费视频| 亚洲人成人网毛片在线播放| 久久美女网站免费| 亚洲熟伦熟女新五十路熟妇 | 亚洲AV无码久久久久网站蜜桃| 在线视频网址免费播放| 在线观看国产情趣免费视频| 亚洲成人免费在线观看| 久久国产精品成人免费| 亚洲精品第五页中文字幕| 国产拍拍拍无码视频免费| 久久精品国产亚洲精品2020| 在线观看免费视频一区| 在线观看亚洲成人| 免费看内射乌克兰女| 免费国产a国产片高清网站| 国产精品免费久久久久影院| 亚洲AV无码乱码精品国产| 久久精品国产亚洲AV天海翼| 又黄又爽又成人免费视频| 午夜亚洲国产理论秋霞| **aaaaa毛片免费同男同女| 久久精品国产亚洲AV网站| 日本视频免费高清一本18| 久久精品亚洲视频|