Gradle語法基礎解析

 

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

Gradle爲什麼物

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

1.Gradle是一門語言 2.Gradle是一個自動化構建工具 既然單從概念上得不到很好的理解,那麼做爲學習一門語言和一個工具,只能經過使用來加強概念和功能上的瞭解了.git

Project和Task、Action

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

  • 每個構建都是由一個或多個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.gradlemaven

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

在命令行裏,進入腳本所在的文件夾而後輸入命令gradle -q hello來執行構建腳本(前提是你安裝了Gradle並配置了環境變量),會在控制檯窗口獲得以下輸出ide

$ 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

相關文章
相關標籤/搜索