gradle技巧之語法淺談

jopen 9年前發布 | 20K 次閱讀 Android開發 移動開發 Gradle

  • 原文鏈接 : Gradle tip #2: understanding syntax
  • 原文作者 : Pavlo Dudka
  • 譯文出自 : 開發技術前線 www.devtf.cn
  • 譯者 : FTExplore
  • 狀態 : 未完成 / 校對中 / 完成
  • </ul> </blockquote>

    回顧

    在上一篇的博文(Gradle tip #2 : Tasks)中,我們討論了gradle構建的基本單位Task. 并且介紹了構建過程的各個階段及其生命周期.而本文會重點介紹gradle的語法.只有具備了gradle
    的相關語法知識,才會大幅度的提高對于閱讀、學習或者編寫gradle腳本的效率,正所謂”磨刀不誤砍柴工”是也.

    引言

    gradle 是groovy語言實現的構建工具. groovy是運行在jvm平臺的一門敏捷開發語言.其語法和java有諸多類似之處,然而其具備一些java沒有的概念需要讀者細細體會.下面會詳細的介紹
    groovy的基本語法,當然如果您已經對groovy的語法有了一定的了解.可以直接跳過這一小節.

    1、閉包的基本語法

    閉包是groovy中最重要的概念之一. 簡單地說閉包(Closures)是一段代碼塊. 這個代碼塊可以接受參數并具有返回值. 有一點要非常注意的是, 閉包往往不是在需要使用的時候才寫出來
    這么一段代碼(就像Java的匿名類那樣), 通過def 關鍵字可以聲明一個變量代表一個閉包,然后在需要的時候直接使用該變量即可,多說無益,請看如下的例子:

    一個簡單的hello world閉包:

    def myClosure = { println 'Hello world!' }

    //execute our closure myClosure()</pre></div>


    </div>

    output: Hello world!

    如下是一個接受參數的閉包的例子:

    def myClosure = {String str -> println str }

    //execute our closure myClosure('Hello world!')</pre></div> </div>

    output: Hello world!

    如果閉包只接受一個參數,這個參數在代碼塊中可以用it代替:

    def myClosure = {println it }

    //execute our closure myClosure('Hello world!')</pre></div> </div>

    output: Hello world!

    如下是接受多個參數的閉包的例子:

    def myClosure = {String str, int num -> println "$str : $num" }

    //execute our closure myClosure('my string', 21)</pre></div> </div>

    output: my string : 21

    閉包里面的參數類型可以省略不寫,例子如下:

    def myClosure = {str, num -> println "$str : $num" }

    //execute our closure myClosure('my string', 21)</pre></div>


    </div>

    output: my string : 21

    閉包還有一個比較酷的寫法就是,可以直接調用context里面的變量,默認的context就是創建這個閉包的類(class) 例子如下:

    def myVar = 'Hello World!'
    def myClosure = {println myVar}
    myClosure()
    </div>

    output: Hello world!

    上面提到了閉包可以直接調用context的變量,這個context可以通過setDelegate()方法來改變,極大的增加了閉包的靈活性!

    def myClosure = {println myVar} //I'm referencing myVar from MyClass class
    MyClass m = new MyClass()
    myClosure.setDelegate(m)
    myClosure()

    class MyClass { def myVar = 'Hello from MyClass!' }</pre></div> </div>

    output: Hello from MyClass!

    2、閉包可以作為參數進行傳遞

    在groovy中,將閉包作為參數傳遞進函數,是將邏輯進行分離解耦的重要手段.在上述的例子中,我們已經嘗試了如何將閉包作為參數進行傳遞.下面我們總結一下傳遞閉包的方法:

    1 接受一個參數的函數

    myMethod(myClosure)

    2 如果函數只接受一個參數,括號可以忽略

    myMethod myClosure

    3 可以將閉包以插入語的形式創建

    myMethod {println ‘Hello World’}

    4 函數接受兩個參數

    myMethod(arg1, myClosure)

    5 接受兩個參數,同樣可以用插入語創建閉包

    myMethod(arg1, { println ‘Hello World’ })

    6 如果存在多個參數,且最后一個參數是閉包,閉包可以不寫在括號內

    myMethod(arg1) { println ‘Hello World’ }

    細心的朋友們是不是覺得上述的六種用法中,第三條和第六條很眼熟?很像gradle中的scripts了?

    Gradle

    在知道了groovy的基本語法(尤其是閉包)之后,下面我們就以一個簡單的gradle 腳本作為例子具體感受一下:

    來自:http://www.devtf.cn/?p=896

     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!