Gradle語法基礎解析


 

在從ADT轉移到AndroidStudio下開發,必然會遇到Gradle腳本打包的問題.看懂一個腳本最基本的前提就是了解它的語法,我在轉移開發環境的過程中,也開始接觸學習Gradle,在此做了一些總結,方便自己查閱.

Gradle為何物

第一次接着Gradle,對它做了大致的了解。按照網上普遍的說法:Gradle是以Groovy語言為基礎,面向Java應用為主。基於DSL(領域特定語言)語法的自動化構建工具. 看到這里我依舊還是有點雲里霧里的,不過抓住了兩個重點:

1.Gradle是一門語言 2.Gradle是一個自動化構建工具 既然單從概念上得不到很好的理解,那么作為學習一門語言和一個工具,只能通過使用來增強概念和功能上的了解了.

Project和Task、Action

Gradle里面的任何東西都是基於Project和Task這兩個概念,基於這兩個概念,Gradle官方放出的指導手冊是這么描述的:

  • 每一個構建都是由一個或多個Project構成的.一個Project到底代表什么依賴於你想用Gradle做什么.舉個例子,一個Project可以代表一個JAR或者一個網頁應用.它也可能代表一個發布的 ZIP壓縮包,這個ZIP可能是由許多其他項目的JARs構成的.但是一個Project不一定非要代表被構建的某個東西.它可以代表一件**要做的事,比如部署你的應用.
  • 每一個Project是由一個或多個Task構成的.一個Task代表一些更加細化的構建.可能是編譯一些classes,創建一個JAR,生成javadoc,或者生成某個目錄的壓縮文件.
  • 每個Task又是由一個或多個Action構成的,Gradle中有兩種類型的Action,分別是doFirst和doLast.

在AndroidStudio構建生成一個apk的安裝包,它就要依賴於build.gradle腳本進行構建.此時生成apk包這樣一件事情就可以理解成為一個Project(要做一件什么事),而生成apk包只是一個比較大一統的概念.打包的過程需要進行各種各樣的配置,例如配置版本號,最低兼容Android幾的平台,打包簽名等.這些相當於生成apk包這個Project的一個個具體的子步驟,也就是Gradle中的Task.

基礎語法

了解大概的一些基本概念之后,最重要的還是開始下手打碼實戰,創建自己的第一個Gradle構建腳本文件build.gradle

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

在命令行里,進入腳本所在的文件夾然后輸入命令gradle -q hello來執行構建腳本(前提是你安裝了Gradle並配置了環境變量),會在控制台窗口得到如下輸出

$ gradle -q hello
Hello world!

這個命令所執行的事情可以分為以下幾個步驟 1.去build.gradle文件中查找hello這個task,並且做編譯執行; 2.執行hello task中每個action里面的流程,此處只有doLast{}一個action負責輸出Hello world;

接下來看另外一段Gradle腳本

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

執行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() } }

看到這里,有沒有發現其實Gradle的語法,其實跟Java是非常類似的,哈哈...其實網上也存在着一種說法: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會根據你賦值的類型,將變量轉換成對應的基本類型. 最后來看一下Gradle里面如何使用循環的,直接看下面兩段代碼

task rounder << {
	10.times{ println "it is: " + it } }
task rounder << {
	10.times{a-> println "it is: " + a } }

上面的兩段代碼的執行結果相同,如下:

$ 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次的循環,.times 和 it是關鍵字,其中**..times**.表示循環,10.times表示執行10次的一個循環,it表示循環中的計數值. 對於it,我們也可以自定義一個變量獲取這個計數值,像第二段代碼中的a->就是表示用a來取代it獲取這個循環中的計數值.對於

println "it is: " + a

我們也可以等價寫成

println "it is: $a"//$變量名,表示去取變量的值

任務依賴

Gradle中存在一種依賴關系,所謂依賴關系可以簡單的描述成一個Task的執行需要已另一個Task作為基礎,繼續看下面的兩段代碼

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!' }

上面兩段代碼的都是表示在執行intro task之前會先依賴執行hello task,唯一的區別就是被依賴的task是定義在調用之前還是調用之后,看到這里是否感覺這種依賴的關系相當於函數調用傳入參數那樣..顯得非常易懂.

多項目和遠程倉庫

Gradle支持可以將一個Project划分成為一個或多個子Project來構成

include 'SubProject1','SubProject2','SubProject3'.........;

可以支持使用本地的mavenCentral庫,或者是遠程服務器上的庫

repositories {
    mavenCentral()//本地庫支持 maven { url "http://repo.mycompany.com/maven2" //遠程庫地址 } }

常用的Gradle命令

下面介紹一些Gradle中常用的命令操作

  • 查看版本號: gradle -v
  • 編譯執行某個task: gradle Task名
  • 靜默編譯執行某個task: gradle -q Task名(q表示quiet模式,表示編譯執行Gradle腳本的過程中,只輸出必要的信息. 除了quiet模式外,Gradle中還有其他三種模式)
  • 編譯執行某個Project中的某個task:gradle -b Project名 Task名(Gradle默認只執行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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM