領域驅動設計(DDD)
如果第一次聽說領域驅動設計,那麼趕緊買一本,或借一本Eric Evans寫的那麼同名經典書補一下課。Gradle是一個自動化build工具,所以Gradle面對的領域就是自動化構建這一領域。Gradle是按照DDD的思想設計和開發的,所以自動化構建領域裏的大部分概念,在Gradle的源代碼裏都有一個接口或類與之對應。本文介紹對Gradle新手來說最重要的三個領域對象:Project、Task、Action。
Project
Project是Gradle最重要的一個領域對象,我們寫的build.gradle腳本的全部作用,其實就是配置一個Project實例。在build.gradle腳本里,我們可以隱式的操縱Project實例,比如,apply插件、聲明依賴、定義Task等,如下所示:
apply plugin: 'groovy'
dependencies {
compile "org.eclipse.jetty.aggregate:jetty-all:9.1.3.v20140225"
}
task myTask {
// ...
}
apply、dependencies、task等實際上是Project的方法,參數是一個代碼塊。如果需要,也可以顯示的操縱Project實例,比如:
project.ext.myProp = 'myValue'
Task
Gradle的Task等同於Ant的Target。在內部,Task被組織成了一個有向無環圖(DAG)。Gradle保證Task按照依賴順序執行,並且每個Task最多隻被執行一次。當我們看到下面這段腳本的時候,只要明白兩點就可以了:
task myTask {
// ...
}
- 給Project添加一個名爲“myTask”的任務
- 用一個閉包來配置這個任務
在閉包中,我們可以充分利用Gradle提供的DSL來配置任務,比如,給任務添加Action。
Action
Task可以包含n個Action,Task提供了doFirst和doLast方法來給自己添加Action,如下所示:
task myTask {
doFirst {
println 'hello'
}
doLast {
println 'world'
}
}
還提供了<<運算符,如下所示:
task myTask << {
println 'hello world'
}
結論
build.gradle腳本的真正作用,就是配置一個Project實例。在執行build腳本之前,Gradle會爲我們準備好一個Project實例,執行完腳本之後,Gradle會按照DAG依次執行任務。