Gradle使用者指南之初學者教程(三)

來源:互聯網
上載者:User

標籤:gradle   android   android-s   tutorials   

寫在前面的話:
博主最近在學習Android Studio相關的東西。Gradle相對於我這個從Eclipse轉過來的Android開發人員,也算是一個全新的事物。但它卻承擔著Android構建系統中相當重要的一環。本著與人方便,自己方便的精神,覺得有必要翻譯一下《Gradle User Guide》中的Tutorials相關部分。由於英語水平相當有限,請大家多多指教。

文章地址:http://blog.csdn.net/mikulee/article/details/45478177
英文原文地址:http://gradle.org/docs/current/userguide/tutorial_using_tasks.html
請尊重相關知識著作權,謝謝。

第六章. 構建指令碼基礎6.1. Projects and tasks(工程和任務)

Gradle中的所有東西都以這兩個概念為基礎:projects 和 tasks.

每個Gradle構建都以一個或多個projects組合而成。一個project代表的意義依賴於你正在用Gradle處理什麼。例如,一個project可能代表一個庫(JAR)或網頁應用(web application).它可能代表其他項目的庫的ZIP壓縮包發布版。一個project並不需要代表要構建的什麼確切東西,它可能僅僅用來說明某個東西已經完成了,例如發布你的應用到工作或者生產環節去。如果你對這些概念性的東西還不夠清楚,請不要緊張。Gradle的構建規則支援添加一個或多個project到底是什麼的具體定義。

每個project都是有一個或多個tasks組成。一個task代表一個不可分割的構建工作。它可能編譯一些calsses,建立JAR,產生Javadoc,或者發布一些檔案到倉庫裡。

從現在開始,我們將把注意力集中在為一個project構建定義一些簡單的tasks.後面的章節會深入學習處理多個projects的projects和tasks。

6.2. Hello world

當你用gradle命令運行一個Gradle構建的時候,gradle命令會在目前的目錄尋找一個命名為build.gradle的檔案。我們稱呼build.gradle檔案為構建指令碼(build script),雖然嚴格來說,它是一個構建配置指令碼。這個構建指令碼定義了一個project及一些和它相關的的tasks.

為了驗證這個,建立一個build.gradle檔案,並添加下面的構建指令碼。

例子 6.1. 你的第一個構建指令碼
build.gradle

task hello {    doLast {        println ‘Hello world!‘    }}

在命令列shell中,進入到包含這個build.gradle的目錄,運行gradle -q hello去執行這個構建指令碼。

例子 6.2. 運行一個構建指令碼
gradle -q hello的輸出

> gradle -q helloHello world!

這裡發生了什嗎?這個構建指令碼定義了一個單獨的命名為hello的任務,並添加了一個動作進去。當你運行gradle hello的時候,Gradle執行了這個hello任務,繼而執行了你提供的動作。這個動作是一個包含一些執行Groovy代碼的閉包。

如果你覺得這個看起來像Ant target,你是對的。Gradle task任務和Ant target是差不多的,但你會看到,它們(Gradle)更強大.我們使用了一個和Ant不一樣的專業術語,因為我們覺得task這個詞比target更加傳神。不幸的是,這是一個和ant衝突的術語,例如Ant中調用自己的命令,例如javac或copy,tasks。所以當我們提到tasks時,我們要說的是Gradle tasks.如果我們要說 Ant tasks(Ant 命令)時,我們會明確的說 Ant task。

6.3. A shortcut task definition(定義任務的捷徑)

這裡有一個快速定義一個task的方法,非常簡潔,例如要定義上面提到的hell task。
例子6.3.一個task定義捷徑
build.gradle

task hell << {    println ‘Hello world!‘}

同樣,我們定義了一個名稱為hello的可執行任務,其中包含了一個單獨的閉包。我們將會在整個使用者指南中使用這種風格的task定義方式。

6.4. Build scripts are code(構建指令碼是代碼)

Gradle構建指令碼給予你一個全功能的Groovy。作為引子,請看下面這2個樣本:
例子6.4. 在Gradle任務中使用Groovy
build.gradle

task upper << {    String someString = ‘mY_nAmE‘    println "Original: " + someString     println "Upper case: " + someString.toUpperCase()}

gradle -q upper 輸出:

> gradle -q upperOriginal: mY_nAmEUpper case: MY_NAME

或

例子6.5. 在Gradle任務中使用Groovy
build.gradle

task count << {    4.times { print "$it " }}

gradle -q count 輸出:

> gradle -q count0 1 2 3 
6.5. Task dependencies(任務依賴)

你很可能已經想到,你可以聲明一些可以依賴於其他任務的任務。
例子6.6. 聲明一個依賴於其他task的task
build.gradle

task hello << {    println ‘Hello world!‘}task intro(dependsOn: hello) << {    println "I‘m Gradle"}

gradle -q intro 輸出:

> gradle -q introHello world!I‘m Gradle

可以添加一個還沒存在的task作為依賴:
例子6.7. 懶依賴-另外的task還沒存在
build.gradle

task taskX(dependsOn: ‘taskY‘) << {    println ‘taskX‘}task taskY << {    println ‘taskY‘}

gradle -q taskX 輸出:

> gradle -q taskXtaskYtaskX

taskX對應taskY的依賴關係先於taskY的定義。這對應多重項目構建非常重要。更多任務依賴的討論可以參考 為一個task添加多個依賴。
請注意,當你要關聯一個未存在的task時,不可以使用快捷標記。(參看6.8小節)

6.6. Dynamic tasks(動態任務)

Groovy的能力遠遠大於定義一個單獨的task.例如,你可以使用它來動態建立task。
例子6.8. 動態建立task
build.gradle

4.times { counter ->    task "task$counter" << {        println "I‘m task number $counter"    }}

gradle -q task1 輸出:

> gradle -q task1I‘m task number 1
6.7. Mainipulating existing tasks (操作調整已經存在任務)

一旦任務被建立,任務就可以被API訪問到。例如,你可以使用這個在運行時去動態給一個任務添加依賴。Ant是不允許這種行為的。
例子6.9. 通過API訪問一個任務-添加一個依賴
build.gradle

4.times { counter ->    task "task$counter" << {        println "I‘m task number $counter"    }}task0.dependsOn task2, task3

gradle -q task0 輸出:

> gradle -q task0I‘m task number 2I‘m task number 3I‘m task number 0

或者你可以為當前已經存在的任務添加其他行為。
例子6.10. 通過API訪問一個任務-添加行為
build.gradle

task hello << {    println ‘Hello Earth‘}hello.doFirst {    println ‘Hello Venus‘}hello.doLast {    println ‘Hello Mars‘}hello << {    println ‘Hello Jupiter‘}

gradle -q task0 輸出:

> gradle -q helloHello VenusHello EarthHello MarsHello Jupiter

對doFirst和doLast的調用可以執行多次。他們添加一個動作到任務動作列表的開始或結束位置。當任務被執行時,在動作動作列表中的動作會被按順序的執行。操作符<<是doLast的同名詞。

6.8. Shortcut notations(快捷標記符)

在上一個例子中,你可能早已注意到有一個方便的標記符號去訪問一個已經存在的task。作為構建指令碼的一個屬性,在每個task中都可以使用這種捷徑。
例子6.11. 用構建指令碼屬性的方式訪問task
build.gradle

task hello << {    println ‘Hello world!‘}hello.doLast {    println "Greetings from the $hello.name task."}

gradle -q hello 輸出:

> gradle -q helloHello world!Greetings from the hello task.

這功能使構建指令碼代碼可讀性更加強,特別是當使用外掛程式提供的任務時,就像一個編譯任務。

6.9. Extra task properties(擴充任務屬性)

你可以向任務添加自訂屬性。添加一個名稱為myProperty的屬性,並設定 ext.myProperty一個初始值。從此以後,這個屬性就可以像預先定義的task屬性一樣被讀取。
例子6.12. 向任務添加一個擴充屬性
build.gradle

task myTask {    ext.myProperty = "myValue"}task printTaskProperties << {    println myTask.myProperty}

gradle -q printTaskProperties 輸出:

> gradle -q printTaskPropertiesmyValue

擴充屬性並不僅限於task.你可以擷取更多擴充屬性的相關內容,請參考擴充屬性。

6.10. Using Ant Tasks(使用Ant任務)

Ant tasks在Gradle中是非常優秀的。Gradle中可以非常簡單的使用Groovy來為Ant task提供非常優秀整合。Groovy封裝了抽象的AntBuilder。在Gradle中使用Ant task相當方便,而且比在build.xml中使用Ant tasks更加強大有力。例如下面的樣本,你可以學到怎麼執行Ant tasks和怎麼訪問Ant屬性。
例子6.13. 使用AntBuilder去執行ant.loadfile target
build.gradle

task loadfile << {    def files = file(‘../antLoadfileResources‘).listFiles().sort()    files.each { File file ->        if (file.isFile()) {            ant.loadfile(srcFile: file, property: file.name)            println " *** $file.name ***"            println "${ant.properties[file.name]}"        }    }}

gradle -q loadfile 輸出:

> gradle -q loadfile *** agile.manifesto.txt ***Individuals and interactions over processes and toolsWorking software over comprehensive documentationCustomer collaboration  over contract negotiationResponding to change over following a plan *** gradle.manifesto.txt ***Make the impossible possible, make the possible easy and make the easy elegant.(inspired by Moshe Feldenkrais)

你可以在你的構建指令碼中使用Ant去做更多事情。你可以參考在Gradle中使用Ant。

6.11. Using methods(使用方法)

Gradle為你如何組織你的構建邏輯劃分等級。組織構建邏輯的第一級便是上面的例子,提前一個方法。
例子6.14. 使用方法去組織你的構建邏輯
build.gradle

task checksum << {    fileList(‘../antLoadfileResources‘).each {File file ->        ant.checksum(file: file, property: "cs_$file.name")        println "$file.name Checksum: ${ant.properties["cs_$file.name"]}"    }}task loadfile << {    fileList(‘../antLoadfileResources‘).each {File file ->        ant.loadfile(srcFile: file, property: file.name)        println "I‘m fond of $file.name"    }}File[] fileList(String dir) {    file(dir).listFiles({file -> file.isFile() } as FileFilter).sort()}

gradle -q loadfile 輸出:

> gradle -q loadfileI‘m fond of agile.manifesto.txtI‘m fond of gradle.manifesto.txt

遲點你將會看到在多重項目構建方面,子項目之間可以有很多共用的方法。如果你的構建邏輯變得更加複雜,Gradle可以提供給你其他非常方便的方法去組織構建邏輯。我們已經準備了整整一個章節去討論它。可以參看組織構建邏輯。

6.12. Default tasks(預設任務)

Gradle允許你為你的構建定義一個或多個預設tasks。
例子6.15. 定義預設任務
build.gradle

defaultTasks ‘clean‘, ‘run‘task clean << {    println ‘Default Cleaning!‘}task run << {    println ‘Default Running!‘}task other << {    println "I‘m not a default task!"}

gradle -q 輸出:

> gradle -qDefault Cleaning!Default Running!

這個等價於去允許gradle clean run。在多重項目構建中,每個子項目可以有自己指定的預設tasks.如果一個子項目沒有指定預設task,父項目的預設task會被使用(假如父項目存在預設task)。

6.13. Configure by DAG(有向非循環圖的配置)

就如我們遲點詳細說明的(參考構建的生命週期),Gradle有一個設定階段和一個執行階段。設定階段完成後,Gradle瞭解到所有將會被執行到的tasks.Gradle會給你提供一個鉤子,讓你可以使用到這些資訊。一個用例是去檢查release task是否在這些即將被執行的任務之中。根據這個,你可以給一些變數賦予不同的值。
在下面這個例子中,distribution和release這2個tasks會有不同的版本值。
例子6.16. 選擇不同的task,輸出不同的結果
build.gradle

task distribution << {    println "We build the zip with version=$version"}task release(dependsOn: ‘distribution‘) << {    println ‘We release now‘}gradle.taskGraph.whenReady {taskGraph ->    if (taskGraph.hasTask(release)) {        version = ‘1.0‘    } else {        version = ‘1.0-SNAPSHOT‘    }}

gradle -q distribution 輸出:

> gradle -q distributionWe build the zip with version=1.0-SNAPSHOT

gradle -q release 輸出:

> gradle -q releaseWe build the zip with version=1.0We release now

重要的事情是whenReady在release被執行前影響到了release task。即使release不是主task,也可以生效。

6.14. Where to next?(接下來怎麼學習?)

在這個章節,我們簡單的介紹了task。但對task的學習還沒結束。如果你想更詳細的學習task,請到這裡學習:更多關於task的事情。

否則,繼續第七章Java快速開始的教程和第八章依賴管理基礎。

Gradle使用者指南之初學者教程(三)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.