【認識 Gradle】(5)Gradle Task 觀念導讀
【認識 Gradle】(4)看懂 Gradle Script << 前情 初學撰寫 Gradle Script 焦點多著在撰寫 task,透過寫自有的 task 將專案適度地客製化。Gradle Task 『補充教材』將目標放在 task 的語法與內建 task 的運用。Gradle Task 的概念近似於 Ant Target,不過 Gradle 是 DSL 而不是像 Ant 般地 XML 描述資料,它在 Task 的操作上就如同程式語言的撰寫。Gradle Task 其實是 Action 的容器,實際執行動作的邏輯會被 Gralde 由 Groovy Closure 轉換成 Action 物件,它就放置在 Gradle Task 內部。 對 Gradle DSL 來說, 解讀 Gradle Task在許多 Gradle 的教學內,最先介紹是的怎麼寫出一個 Task,依慣例在前幾章會看到滿滿的 Hello World: task hello << { println 'Hello World' } 也可以這樣寫: task hello { doLast { println 'Hello world!' } } 也可以寫成這樣(不過這樣寫的『語意』不同於上述二者,後續會再討論): task hello { println 'Hello World' } 這些寫法部分來自書本,部分來自 Gradle Getting Started 的 Build Script Basics。一個 task 搞了那麼多寫法,對剛開始學習 Gradle 的人來說會產生混亂。這也是為何上一單元要介紹如何看懂 Gradle Script 的目的,運用那份知識我們能再次解讀 Gradle Task。首先由文件查出有沒有加 task hello << { } 與 task hello { } 讀者是否能由 Project 的 Javadoc 查出它們分別對應至哪個方法呢? 對有使用 Groovy 是支援運算子多載的語言,也就是能重新定義一個物件配合特定運算子使用的功能。以 由上面的資訊可以知道使用 task hello { } 先前的 task hello { println delegate.class.name println delegate instanceof Task } qty:gradleLab qrtt1$ gradle -q hello org.gradle.api.DefaultTask_Decorated true 在設計上,這個 Closure 是用來設定 task 內容,它並不是 Action。差別是什麼?Action 要明確呼被 task 時才會呼叫,而 configure 動作在初始化 Task 時就會執行。差別就在若是將應該執行的內容寫在 configure 內時,它就會在你非預期的情況時執行。直接看這個例子: task hello { println "Hello World" } 請試著呼叫一個不存在的 task,你會看到 qty:gradleLab qrtt1$ gradle -q noSuchTaskname Hello World FAILURE: Could not determine which tasks to execute. * What went wrong: Task 'noSuchTaskname' not found in root project 'gradleLab'. * Try: Run gradle tasks to get a list of available tasks. 所以,我們在 task 名稱後加上 Task TypeGradle 提供不同的語法建立 task,而不加 task mydoc(type:Copy) { from 'src/main/doc' into 'build/target/doc' } 這是一個名為 mydoc 的 task,它會被建立成 Copy Task 物件,而 Closure 的 delegate 即為這個物件,能使用 舉個例來說,一般在編譯 Java 專案時,只會有 classes 包起來的 JAR 檔,我們可以讓它一併編出 Javadoc 與 Source JARs: apply plugin: 'java' task sourcesJar(type: Jar, dependsOn:classes) { classifier = 'sources' from sourceSets.main.allSource } task javadocJar(type: Jar, dependsOn:javadoc) { classifier = 'javadoc' from javadoc.destinationDir } artifacts { archives sourcesJar archives javadocJar } 主要是利用 Project 的 artifacts 加入新的 archives 動作,它對應到另外二個 Jar Task,在 Jar Task 內做了適當的設定,最後它會將相關的 JARs 產生出來。 課程回顧Gradle Task 還有著更多的細節,本篇教學針對 DSL 討論將常被人誤用或理解模稜兩可之處點題。能將這篇的內容當作學習 Gradle Task 的輔助教材,無論你參考書籍或官方文件,都能由此篇導讀獲得觀念釐清。
此篇教學的目標在解析概念並做為實際學習 task 撰寫的補充教材,針對 task 本身的教學可使用 Gradle 官方手冊:
|