本文首發於微信公衆號「劉望舒」
原文連接:Gradle入門前奏html
在上一篇文章Android Gradle(一)爲何如今要用Gradle?中,咱們學習了常見的構建工具,以及Gradle與這些構建工具相比有那些不一樣的特性。這一篇文章咱們接着來學習Gradle入門須要掌握的知識,包括配置環境、實現Hello World、Gradle的任務、Gradle日誌和Gradle命令行,掌握這些可以更好的理解Gradle。前端
安裝Gradle前要確保系統已經配置好JDK的環境,要求JDK的版本在1.7或更高。 Gradle的安裝有兩種形式:java
關於包管理器安裝能夠查看官方文檔 ,這裏主要介紹手動安裝,在https://gradle.org/releases/中下載你想要Gradle版本的binary-only。api
和配置Java環境相似,在系統變量中添加GRADLE_HOME: bash
而後再將%GRADLE_HOME%\bin添加到path系統變量中就能夠了,運行gradle -v命令來進行驗證。步驟以下:微信
export PATH=$PATH:~/develop/gradle-4.10.1/bin
複製代碼
配置完Gradle環境後,按照慣例要實現Gradle的Hello World,這裏以Windows平臺爲例。 build.gradle爲Gradle默認的構建腳本文件,運行Gradle 命令時,會從當前目錄下尋找 build.gradle 文件來執行構建。 咱們先新建一個目錄,好比D:\Android\gradle_demo,在這個目錄中新建一個 build.gradle 文件,輸入如下內容:app
task hello {
doLast {
println 'Hello world!'
}
}
複製代碼
而後在該文件所在目錄下運行gradle -q hello構建腳本, 就會打印出「Hello world!」。ide
項目構建比較複雜,爲了使用各類開發語言的開發者都可以快速的構建項目,專家們開發出了Gradle這個基於Groovy的DSL,DSL(Domain Specifc Language)意爲領域特定語言,只用於某個特定的領域。咱們只要按照Groovy的DSL語法來寫,就能夠輕鬆構建項目。 task(任務)和action(動做)是Gradle的重要元素。上面的代碼中,task表明一個獨立的原子性操做,好比複製一個文件,編譯一次Java代碼,這裏咱們簡單的定義一個名爲hello的任務。doLast 表明task執行的最後一個action,通俗來說就是task執行完畢後會回調doLast中的代碼,在上面這個例子中就會打印 'Hello world!'工具
上面的例子還能夠寫的更簡潔一些,操做符<< 是doLast方法的快捷版本,它們作了相同的事情,以下所示。oop
task hello << {
println 'Hello world!'
}
複製代碼
爲了更好的講解後面的Gradle 命令行,這裏簡單的介紹下Gradle的任務,包括建立任務、任務依賴、 動態定義任務和任務的分組和描述。
除了第2節實現Hello World的例子採用的建立任務方式,還有其餘的3種建立任務方式。 1.直接用任務名稱建立。
def Task hello=task(hello)
hello.doLast{
println "hello world"
}
複製代碼
2.任務名稱+任務配置建立。
def Task hello=task(hello,group:BasePlugin.BUILD_GROUP)
hello.doLast{
println "hello world"
}
複製代碼
其中group爲任務配置項,它表明了分組,關於分組具體見3.4小節。
3.TaskContainer的create方法建立。
tasks.create(name: 'hello') << {
println "hello world"
}
複製代碼
此前建立任務的方式最終都會調用tasks的create方法,其中tasks類型爲TaskContainer。
任務依賴會決定任務運行的前後順序,被依賴的任務會在定義依賴的任務以前執行。建立任務間的依賴關係以下所示。
task hello << {
println 'Hello world!'
}
task go(dependsOn: hello) << {
println "go for it"
}
複製代碼
在hello任務的基礎上增長了一個名爲go的任務,經過dependsOn來指定依賴的任務爲hello,所以go任務運行在hello以後。 運行gradle -q go構建腳本,打印結果以下: Hello world! go for it
動態定義任務指的是在運行時來定義任務的名稱,以下所示。
3.times {number ->
task "task$number" << {
println "task $number"
}
}
複製代碼
這裏用到了Groovy語法,關於Groovy語法會在本系列後續的文章進行介紹。times是Groovy在java.lang.Number中拓展的方法,是一個定時器。3.times中循環建立了三個新任務,隱式變量number的值爲0,1,2,任務的名稱由task加上number的值組成,達到了動態定義任務的目的。 運行gradle -q task0構建腳本,打印結果以下: task 0
Gradle有任務組的概念,能夠爲任務配置分組和描述,以便於更好的管理任務,擁有良好的可讀性。改造3.2小節的例子,爲hello任務添加分組和描述。
task hello {
group = 'build'
description = 'hello world'
doLast {
println "任務分組: ${group}"
println "任務描述: ${description}"
}
}
task go(dependsOn: hello) << {
println "go for it"
}
複製代碼
也能夠採用3.1小節中其餘的建立任務方式來爲任務添加分組和描述,以下所示。
def Task hello=task(hello)
hello.description ='hello world'
hello.group=BasePlugin.BUILD_GROUP
hello.doLast{
println "任務分組: ${group}"
println "任務描述: ${description}"
}
task go(dependsOn: hello) << {
println "go for it"
}
複製代碼
和Android同樣,Gradle也定義了日誌級別。
前面咱們經過gradle -q +任務名稱來運行一個指定的task,這個q是命令行開關選項,經過開關選項能夠控制輸出的日誌級別。
從命令行的角度,Gradle和Git相似,命令均可以用一些IDE、圖形工具來代替,可是若是你對Gradle 命令行熟悉,會幫助你更好的理解Gradle,高效的運用Gradle。
這一節的命令行以3.4小節的代碼爲例,此前咱們經過gradle -q +任務名稱來運行一個指定的任務,若是不知道任務的名稱,能夠 經過運行gradle -q tasks命令來獲取全部的任務信息,這樣就不須要打開源碼了。
Build tasks
-----------
hello - hello world
Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.
Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root projec
t 'gradle_demo'.
components - Displays the components produced by root project 'gradle_demo'. [in
cubating]
dependencies - Displays all dependencies declared in root project 'gradle_demo'.
dependencyInsight - Displays the insight into a specific dependency in root proj
ect 'gradle_demo'.
dependentComponents - Displays the dependent components of components in root pr
oject 'gradle_demo'. [incubating]
help - Displays a help message.
model - Displays the configuration model of root project 'gradle_demo'. [incubat
ing]
projects - Displays the sub-projects of root project 'gradle_demo'.
properties - Displays the properties of root project 'gradle_demo'.
tasks - Displays the tasks runnable from root project 'gradle_demo'.
To see all tasks and more detail, run gradle tasks --all
To see more detail about a task, run gradle help --task <task>
複製代碼
默認狀況下,只會顯示那些被分組的任務的名稱和描述。好比Build tasks(Build 任務組)中有咱們定義的hello任務,Build Setup tasks中有init和wrapper,Help tasks有buildEnvironment 和components等等。
若是咱們不想運行go任務,能夠運行gradle hello -x go命令:
> Task :hello
任務分組: build
任務描述: hello world
Deprecated Gradle features were used in this build, making it incompatible with
Gradle 5.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/4.10.1/userguide/command_line_interface.html#sec:com
mand_line_warnings
BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed
複製代碼
能夠看出,並無運行go任務。
經過運行gradle -q help --task hello命令來顯示hello任務的幫助信息。
Detailed task information for hello
Path
:hello Type Task (org.gradle.api.Task) Description hello world Group build 複製代碼
能夠看到hello任務的路徑、類型、描述和分組。
task helloWorld << {
println 'Hello world!'
}
task goForit<< {
println "go for it"
}
複製代碼
經過命令行一次執行多個任務,每一個任務一般只會執行一次,不管是在命令行中指定任務仍是任務依賴,上面的例子咱們運行gradle helloWorld goForit,會先執行helloWorld任務後執行goForit任務。
能夠對使用駝峯命名的任務進行縮寫,對於名稱特別長的任務這個特性很是有用,好比5.4小節中的例子只須要執行gradle hW gF 就能夠了,不過須要注意一點,那就是任務名稱的縮寫必須是惟一的,若是5.4小節中第二個任務的名稱爲helloWangshu,那麼就會報錯。
分享Android、Java和大前端相關技術