Gradle语法基础解析
?
在從ADT轉移到AndroidStudio下開發(fā),必然會遇到Gradle腳本打包的問題.看懂一個腳本最基本的前提就是了解它的語法,我在轉移開發(fā)環(huán)境的過程中,也開始接觸學習Gradle,在此做了一些總結,方便自己查閱.
Gradle為何物
第一次接著Gradle,對它做了大致的了解。按照網(wǎng)上普遍的說法:Gradle是以Groovy語言為基礎,面向Java應用為主。基于DSL(領域特定語言)語法的自動化構建工具.?看到這里我依舊還是有點云里霧里的,不過抓住了兩個重點:
1.Gradle是一門語言 2.Gradle是一個自動化構建工具 既然單從概念上得不到很好的理解,那么作為學習一門語言和一個工具,只能通過使用來增強概念和功能上的了解了.
Project和Task、Action
Gradle里面的任何東西都是基于Project和Task這兩個概念,基于這兩個概念,Gradle官方放出的指導手冊是這么描述的:
- 每一個構建都是由一個或多個Project構成的.一個Project到底代表什么依賴于你想用Gradle做什么.舉個例子,一個Project可以代表一個JAR或者一個網(wǎng)頁應用.它也可能代表一個發(fā)布的 ZIP壓縮包,這個ZIP可能是由許多其他項目的JARs構成的.但是一個Project不一定非要代表被構建的某個東西.它可以代表一件**要做的事,比如部署你的應用.
- 每一個Project是由一個或多個Task構成的.一個Task代表一些更加細化的構建.可能是編譯一些classes,創(chuàng)建一個JAR,生成javadoc,或者生成某個目錄的壓縮文件.
- 每個Task又是由一個或多個Action構成的,Gradle中有兩種類型的Action,分別是doFirst和doLast.
在AndroidStudio構建生成一個apk的安裝包,它就要依賴于build.gradle腳本進行構建.此時生成apk包這樣一件事情就可以理解成為一個Project(要做一件什么事),而生成apk包只是一個比較大一統(tǒng)的概念.打包的過程需要進行各種各樣的配置,例如配置版本號,最低兼容Android幾的平臺,打包簽名等.這些相當于生成apk包這個Project的一個個具體的子步驟,也就是Gradle中的Task.
基礎語法
了解大概的一些基本概念之后,最重要的還是開始下手打碼實戰(zhàn),創(chuàng)建自己的第一個Gradle構建腳本文件build.gradle
task hello {doLast {println 'Hello world!'} }在命令行里,進入腳本所在的文件夾然后輸入命令gradle -q hello來執(zhí)行構建腳本(前提是你安裝了Gradle并配置了環(huán)境變量),會在控制臺窗口得到如下輸出
$ gradle -q hello Hello world!這個命令所執(zhí)行的事情可以分為以下幾個步驟 1.去build.gradle文件中查找hello這個task,并且做編譯執(zhí)行; 2.執(zhí)行hello task中每個action里面的流程,此處只有doLast{}一個action負責輸出Hello world;
接下來看另外一段Gradle腳本
task upper << {String someString = 'mY_nAmE' println "Original: " + someString println "Upper case: " + someString.toUpperCase() }執(zhí)行gradle -q upper運行后,可以看到控制臺窗口的輸出如下:
$ gradle -q upper Original: mY_nAmE Upper case: MY_NAME看到此處的代碼,需要做一個簡單的解釋一下,上面的這段代碼和下面的這種寫法是等價的,上面的寫法其實是Gradle提供的doLast{}的一種簡寫方式,因為Gradle直接重載了<<符號.
task upper {doLast{String someString = 'mY_nAmE'println "Original: " + someString println "Upper case: " + someString.toUpperCase() } }看到這里,有沒有發(fā)現(xiàn)其實Gradle的語法,其實跟Java是非常類似的,哈哈...其實網(wǎng)上也存在著一種說法:Groovy就是沒有類型的Java,為什么說是Groovy,其實Gradle相當于Groovy的子類,Groovy的所有特性都被Gradle完整繼承了.看完下面的代碼就能理解為何成為沒有類型的Java的原因了.
task notype << {def oneInt = 1 //等價于 int oneInt = 1 def oneFloat = 1.00 //等價于 ioneFloat = 1.00 def oneString = 'Clock'//等價于 oneString = 'Clock' println "oneInt: " + oneInt println "oneFloat: " + oneFloat println "oneString: " + oneString }編譯運行以上代碼后,即可以看到以下輸出
$ gradle -q notype oneInt: 1 oneFloat: 1.00 oneString: Clock之所以說Groovy是無類型的Java,就是因為不管所有的類型都可以使用**def(define)**來定義一個變量,Gradle會根據(jù)你賦值的類型,將變量轉換成對應的基本類型. 最后來看一下Gradle里面如何使用循環(huán)的,直接看下面兩段代碼
task rounder << {10.times{println "it is: " + it } } task rounder << {10.times{a->println "it is: " + a } }上面的兩段代碼的執(zhí)行結果相同,如下:
$ gradle -q rounder it is: 0 it is: 1 it is: 2 it is: 3 it is: 4 it is: 5 it is: 6 it is: 7 it is: 8 it is: 9都是做一個10次的循環(huán),.times?和?it是關鍵字,其中**..times**.表示循環(huán),10.times表示執(zhí)行10次的一個循環(huán),it表示循環(huán)中的計數(shù)值. 對于it,我們也可以自定義一個變量獲取這個計數(shù)值,像第二段代碼中的a->就是表示用a來取代it獲取這個循環(huán)中的計數(shù)值.對于
println "it is: " + a我們也可以等價寫成
println "it is: $a"//$變量名,表示去取變量的值任務依賴
Gradle中存在一種依賴關系,所謂依賴關系可以簡單的描述成一個Task的執(zhí)行需要已另一個Task作為基礎,繼續(xù)看下面的兩段代碼
task hello << {println 'Hello world!' } task intro(dependsOn: hello) << { println "I'm Gradle" } task intro(dependsOn: 'hello') << {println "I'm Gradle" } task hello << { println 'Hello world!' }上面兩段代碼的都是表示在執(zhí)行intro task之前會先依賴執(zhí)行hello task,唯一的區(qū)別就是被依賴的task是定義在調(diào)用之前還是調(diào)用之后,看到這里是否感覺這種依賴的關系相當于函數(shù)調(diào)用傳入?yún)?shù)那樣..顯得非常易懂.
多項目和遠程倉庫
Gradle支持可以將一個Project劃分成為一個或多個子Project來構成
include 'SubProject1','SubProject2','SubProject3'.........;可以支持使用本地的mavenCentral庫,或者是遠程服務器上的庫
repositories {mavenCentral()//本地庫支持maven {url "http://repo.mycompany.com/maven2" //遠程庫地址 } }常用的Gradle命令
下面介紹一些Gradle中常用的命令操作
- 查看版本號:?gradle -v
- 編譯執(zhí)行某個task:?gradle Task名
- 靜默編譯執(zhí)行某個task:?gradle -q Task名(q表示quiet模式,表示編譯執(zhí)行Gradle腳本的過程中,只輸出必要的信息. 除了quiet模式外,Gradle中還有其他三種模式)
- 編譯執(zhí)行某個Project中的某個task:gradle -b Project名 Task名(Gradle默認只執(zhí)行build.gradle文件中,自定義其他文件xxx.gradle編譯運行顯式指定Project名稱,這里的build.gradle其實表示的就是build Project)
- 顯示所有的Project:gradle projects
- 顯示所有的task:gradle tasks
- 顯示gradle的gui:gradle --gui?或?gradle --gui&(后臺運行)
- 查找所有的gradle命令:?gradle --help
##最后
此處只是一小部分gradle的基礎使用總結,更多的gradle使用方式請戳這里Gradle User Guide
轉載于:https://www.cnblogs.com/sddai/p/10303978.html
總結
以上是生活随笔為你收集整理的Gradle语法基础解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [spfa][差分约束] 洛谷 P308
- 下一篇: Linux日志 系统日志及分析