[Gradle]Quick Start 系列-3 熟悉基本Script語法

[Gradle]Quick Start 系列-3 熟悉基本Script語法

每日一字 in Gradle:

  • projects 專案: 在軟體中包含多個可被建置的元件. 如: 常用的以interface layer的jar, web application的war ... 等. Gradle可處理一個或多個專案.
  • tasks 任務: 每一個建置動作的元素. 如: 編譯, 建立jar, 建立javadoc, 佈署 ... 每一個專案會包含多個任務.

 

在build檔案中的task 宣告方式如下:

   1:   task myTask
   2:   task myTask { configure closure }
   3:   task myType << { task action }
   4:   task myTask(type: SomeType)
   5:   task myTask(type: SomeType) { configure closure }

註: << 等同於 doLast

 

先簡單會一些gradle 及 Groove 語法

 

  • 新增一個任務
task shortcut << {
    println 'shortcut'
}

image

 

  • 使用Groovy 語法
task groovy_dsl << {
    4.times { print "$it\n" }
}

image

 

  • 使用任務依賴 ( 前後順序無影響)
task a(dependsOn: 'b') << {
    println 'a'
}
task b << {
    println 'b'
}

image

 

  • 使用動態 task ?!  (強大, 可用在相似但有部份不同的狀況)
4.times { counter ->
    task "dynamic_$counter" << {
        println "My name is dynamic_$counter"
    }
}

image

 

  • 異常: Could not determine which task to execute.  (打錯字啦當然找不到囉)

image

 

  • 相較於 ANT 的ref , gradle script 可以更簡單直接參考既有task
4.times { counter ->
    task "dynamic_$counter" << {
        println "My name is dynamic_$counter"
    }
}
dynamic_0.dependsOn dynamic_1, dynamic_2

image

 

  • 每一事件都可以重覆宣告, 不會後蓋前
task c 
c.doFirst {
    println 'first'
}
c.doLast {
    println 'last'
}
c << {
    println 'the end'
}

image

 

  • 將參數抽離, 並在任務中使用
task myPrpts 
myPrpts.ip='192.168.0.1'
myPrpts.user='user'
myPrpts.password='password'
task d << {
    println "$myPrpts.ip $myPrpts.user $myPrpts.password"
}

image

 

  • 如果之前的專案已經有穩定的ANT build file, 那也不需要重新編gradle script, 直接整合進來使用即可.
ant.importBuild './ant/build.xml'
execute << {
    println 'the end'
}
 
build.xml
<project name="my" default="execute">
    <target name="execute">
        <echo message="Ant say: Hello world" />
    </target>
</project>

image

 

  • 除task外也可以宣告方法(Function)
task listGradle << {
    showFiles('.')
}
task listAnt(dependsOn: 'listGradle') << {
    showFiles('./ant')
}
File[] showFiles(String dir) {
    def files = file(dir).listFiles({file -> file.isFile() } as FileFilter).sort()
    files.each { File file ->
        if(file.isFile()){
            println "** $file.name **"            
        }            
    }
}

image

 

  • 如同ANT 可以設Defatult target , gradle 亦可設定default task
defaultTasks 'defaultTask_1', 'defaultTask_2'
task defaultTask_1 << {
    println 'defaultTask1'
}
task defaultTask_2 << {
    println 'defaultTask2'
}

image

 

  • 在Gradle生命周期中, 我們可以在組態結束後, 實際執行前, 插入一些行為, 如: 依據組態結果或執行的任務項來加入額外的資訊.
task eatApple << {
    println "Eating a $size apple."
}
task eatOrange(dependsOn: 'eatApple') << {
    println 'Eating a big orange.'
}
gradle.taskGraph.whenReady { taskGraph ->
    if(taskGraph.hasTask(eatOrange)){
        size = 'small' ;
    } else {
        size = 'big' ;
    }
}

image

image

 

  • 字串中的單引號跟雙引號不同, 前者為常數, 後者則可加入一些變數.
task myP
myP.word='go lunch'
task singleQuote << {
    println 'It is $myP.word !!'
}
task doubleQuote(dependsOn: 'singleQuote') << {
    println "It is $myP.word"
}

image