(2)Gradle構(gòu)建

1. 構(gòu)建塊

Gradle構(gòu)建中的兩個基本概念是項目(project)和任務(wù)(task),每個構(gòu)建至少包含一個項目,項目中包含一個或多個任務(wù)。在多項目構(gòu)建中,一個項目可以依賴于其他項目;類似的,任務(wù)可以形成一個依賴關(guān)系圖來確保他們的執(zhí)行順序。

1.1 項目

我們能夠使用以下配置文件對Gradle的構(gòu)建進(jìn)行配置:

  • Gradle構(gòu)建腳本(build.gradle)指定了一個項目和它的任務(wù)。
  • Gradle屬性文件(gradle.properties)用來配置構(gòu)建屬性。
  • Gradle設(shè)置文件(gradle.settings)對于只有一個項目的構(gòu)建而言是可選的,如果我們的構(gòu)建中包含多于一個項目,那么它就是必須的,因為它描述了哪一個項目參與構(gòu)建。每一個多項目的構(gòu)建都必須在項目結(jié)構(gòu)的根目錄中加入一個設(shè)置文件。

Gradle為每個build.gradle都會創(chuàng)建一個相應(yīng)的Project領(lǐng)域?qū)ο?,在編寫Gradle腳本時,我們實際上是在操作諸如Project這樣的Gradle領(lǐng)域?qū)ο?。在多Project的項目中,我們會操作多個Project領(lǐng)域?qū)ο蟆?/p>

當(dāng)構(gòu)建啟動后,gradle會基于build.gradle實例化一個org.gradle.api.Project類,并且能夠通過project變量使其隱式可用,也就是所有變量、方法的調(diào)用都在project。如下面兩句話是一樣的:

group = 'com.abc.gradle'
project.group = 'com.abc.gradle'

調(diào)用的是Project類的setGroup():

【項目重要屬性】

項目幾個重要的屬性:group、name、version,這三個屬性是一個項目的坐標(biāo)。

  • group屬性指定依賴的分組(在Maven中,就是groupId)。
  • name屬性指定依賴的名稱(在Maven中,就是artifactId)。
  • version屬性指定外部依賴的版本(在Maven中,就是version)。

我們假設(shè)我們需要指定以下依賴:

  • 依賴的分組是foo。
  • 依賴的名稱是foo。
  • 依賴的版本是0.1。
  • 在項目編譯時需要這些依賴。

我們可以將以下代碼片段加入到build.gradle中,進(jìn)行依賴聲明:

dependencies {
    compile group: 'foo', name: 'foo', version: '0.1'
}

我們也可以采用一種快捷方式聲明依賴:[group]:[name]:[version]。如果我們想用這種方式,我們可以將以下代碼段加入到build.gradle中:

dependencies {
    compile 'foo:foo:0.1'
}

我們也可以在同一個配置項中加入多個依賴,傳統(tǒng)的方式如下:

dependencies {
    compile (
        [group: 'foo', name: 'foo', version: '0.1'],
        [group: 'bar', name: 'bar', version: '0.1']
    )
}

如果采用快捷方式,那可以是這樣:

dependencies {
    compile 'foo:foo:0.1', 'bar:bar:0.1'
}

自然地,聲明屬于不同配置項的依賴也是可以的。比如說,如果我們想要聲明屬于compile和testCompile配置項的依賴,可以這么做:

dependencies {
    compile group: 'foo', name: 'foo', version: '0.1'
    testCompile group: 'test', name: 'test', version: '0.1'
}

同樣的,給力的快捷方式又來了( ̄︶ ̄)

dependencies {
    compile 'foo:foo:0.1'
    testCompile 'test:test:0.1'
}

【項目重要的方法】

(1)apply:應(yīng)用一個插件

(2)dependencies:聲明項目依賴于哪些jar包或其他項目

(3)repositories:去哪個倉庫找依賴的jar包,在倉庫里面根據(jù)group、name、version確定一個組件

一個Java項目總會依賴于第三方,要么是一個第三方類庫,比如Apache commons;要么是你自己開發(fā)的另外一個Java項目,比如你的web項目依賴于另一個核心的業(yè)務(wù)項目。通常來說,這種依賴的表示形式都是將第三方的Jar文件放在自己項目的classpath下,要么是編譯時的classpath,要么是運行時的classpath。

在聲明對第三方類庫的依賴時,我們需要告訴Gradle在什么地方去獲取這些依賴,即配置Gradle的Repository。在配置好依賴之后,Gradle會自動地下載這些依賴到本地。Gradle可以使用Maven和Ivy的Repository,同時它還可以使用本地文件系統(tǒng)作為Repository。

要配置Maven的Repository是非常簡單,首先我們先了解以下概念。

名稱 解釋
工件坐標(biāo) 工件可以簡單地理解為一個jar包。坐標(biāo)就是三個屬性:group、name、version。通過這三個屬性可以唯一確定一個jar包。
常用倉庫 存儲jar包的地方。常用的倉庫有:mavenLocal/mavenCentral/jcenter、自定義maven倉庫、文件倉庫(基本不怎么使用)。

要配置倉庫,我們只需要在build.gradle文件中加入以下代碼即可:

repositories{   // 配置倉庫,可以配置多個倉庫,按照倉庫的順序去查找jar包
   maven{
      url '私服地址'
   }
   mavenLocal()   
   mavenCentral()  
}

mavenLocal就是本地倉庫:

mavenCentral就是下面這個網(wǎng)站:

在這個網(wǎng)站搜索想要添加的依賴,復(fù)制粘貼到到build.gradle即可添加依賴:

有了倉庫,我們就可以為Gradle配置依賴:

dependencies{
   testCompile group:'junit',name:'junit',version:'4.11'  // 配置依賴
}

(4)task:聲明項目里面有什么任務(wù)

dependencies、repositories等都定義在project里面:

1.2 任務(wù)

任務(wù)主要包括任務(wù)動作和任務(wù)依賴。任務(wù)動作定義了一個最小的工作單元。可以定義依賴于其他任務(wù)、動作序列和執(zhí)行條件。

讓我們來看一個最簡單的Task,創(chuàng)建一個build.gradle文件,內(nèi)容如下:

task helloWorld << {
   println "Hello World!"
}

這里的“<<”表示向helloWorld中加入執(zhí)行代碼——其實就是groovy代碼。Gradle向我們提供了一整套DSL,所以在很多時候我們寫的代碼似乎已經(jīng)脫離了groovy,但是在底層依然是執(zhí)行的groovy。比如上面的task關(guān)鍵字,其實就是一個groovy中的方法,而大括號之間的內(nèi)容則表示傳遞給task()方法的一個閉包。除了“<<”之外,我們還很多種方式可以定義一個Task。

在默認(rèn)情況下,Gradle將當(dāng)前目錄下的build.gradle文件作為項目的構(gòu)建文件。在上面的例子中,我們創(chuàng)建了一個名為helloWorld的Task,在執(zhí)行g(shù)radle命令時,我們指定執(zhí)行這個helloWorld Task。這里的helloWorld是一個DefaultTask類型的對象,這也是定義一個Task時的默認(rèn)類型,當(dāng)然我們也可以顯式地聲明Task的類型,甚至可以自定義一個Task類型。

在與build.gradle相同的目錄下執(zhí)行:

gradle helloWorld

命令行輸出如下:

:helloWorld
Hello World!

BUILD SUCCESSFUL

Total time: 2.544 secs

任務(wù)里面重要的方法:

  • dependsOn:聲明任務(wù)依賴。Task之間可以存在依賴關(guān)系,比如taskA依賴于taskB,那么在執(zhí)行taskA時,Gradle會先執(zhí)行taskB,然后再執(zhí)行taskA。聲明Task依賴關(guān)系的一種方式是在定義一個Task的時候:
task taskA(dependsOn: taskB) {
   //do something
}
  • doFirst、doLast<<:doFirst在任務(wù)列表最前面添加一個動作,doLast在任務(wù)列表最后面添加一個動作。一個任務(wù)可以執(zhí)行多次doFirst、doLast。

Gradle還默認(rèn)為我們提供了dependencies、projects和properties等Task。dependencies用于顯示Project的依賴信息,projects用于顯示所有Project,包括根Project和子Project,而properties則用于顯示一個Project所包含的所有Property。在默認(rèn)情況下,Gradle已經(jīng)為Project添加了很多Property,我們可以調(diào)用以下命令進(jìn)行查看:

gradle properties

在IDEA右側(cè)欄我們可以看到Gradle的任務(wù):

雙擊這個Task我們就可以執(zhí)行指定的Taks,效果和gradle [taskName]命令醫(yī)院。

我們執(zhí)行jar任務(wù)的時候發(fā)現(xiàn)前面還執(zhí)行了其他三個任務(wù),說明jar依賴于這三個任務(wù)。任務(wù)后面的“UP-TO-DATE”意思是最新的,上次構(gòu)件之后這個任務(wù)的輸入輸出并沒有改變,所以這個是跳過的并沒有執(zhí)行。

2. 構(gòu)建生命周期

配置:如def ...這些就是配置代碼,在配置階段執(zhí)行。
執(zhí)行:如doFirst、doLast這些動作代碼會在執(zhí)行階段執(zhí)行。

Gradle還為我們提供了構(gòu)造方法,在初始化完成、配置完成、執(zhí)行完成都有一個構(gòu)造方法。

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

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

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