轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/76408024
本文出自【趙彥軍的博客】html
關於 gradle 相關運用,能夠移步 :Android Gradle使用總結java
Groovy是一種動態語言,它和Java相似(算是Java的升級版,可是又具有腳本語言的特色),都在Java虛擬機中運行。當運行Groovy腳本時它會先被編譯成Java類字節碼,而後經過JVM虛擬機執行這個Java字節碼類。android
關於 groovy 相關知識,移步到這裏:Groovy 使用徹底解析git
每次構建(build)至少由一個project構成,一個project 由一到多個task構成。每一個task表明了構建過程中的一個原子性操做,好比編譯,打包,生成javadoc,發佈等等這些操做。api
gradle : 一個 project 包含多個 task,一個 task 包含多個 Action微信
project -- task1 (Action一、Action2...) -- task2 (Action一、Action2...) -- ...
task 任務的名字 { //do some things }
build.gradleapp
//定義 task , 名字 hello task hello{ println "hello world" } //定義 task,名字 hello task(hello2){ println "hello world2" } //定義 task,名字 hello3 task ('hello3'){ println "hello world3" }
//執行 hello task gradlew hello //執行 hello2 task gradlew hello2 //執行 hello3 task gradlew hello3
在上面的舉例中,是一個非正式的 task , 說非正式是由於建立的 task 裏面沒有 action 。task 本質上又是由一組被順序執行的 Action 對象構成,Action實際上是一段代碼塊,相似於Java中的方法。ide
//在Action 隊列頭部添加Action Task doFirst(Action<? super Task> action); Task doFirst(Closure action); //在Action 隊列尾部添加Action Task doLast(Action<? super Task> action); Task doLast(Closure action); //已通過時了,建議用 doLast 代替 Task leftShift(Closure action); //刪除全部的Action Task deleteAllActions();
build.gradle工具
//建立一個名字爲hello的 task task hello { //建立一個 Action , 添加到 Action 列表的頭部 doFirst(new Action<Task>() { @Override void execute(Task task) { println "action1++++++++++" } }) //建立一個 Action , 添加到 Action 列表的頭部 doFirst { println "action2++++++++++" } }
在 Action 列表中添加了 兩個 Action , Action 列表以下圖所示:gradle
運行 hello task : gradle hello
運行結果:
action2++++++++++ action1++++++++++
leftShift 的做用和 doLast 同樣,在action 列表尾部添加一個Action,只不過如今過期了,官方建議用 doLast 代替。下面舉個小例子:
build.gradle
task hello { //在 Action 列表尾部添加一個 Action leftShift { println "+++++" } }
leftShift 還有一種簡潔寫法,用 <<
代替, 以下所示:
build.gradle
task hello <<{ //在 Action 列表尾部添加一個 Action println "+++++" }
那麼問題來了,task 中的 Action 在何時執行?
會去讀取根工程中 setting.gradle 中的 include 信息,決定有哪幾個工程加入構建,建立 project 實例,好比下面有三個工程: include ':app', ':lib1', ':lib2 。
會去執行全部工程的 build.gradle 腳本,配置 project對象,一個對象由多個任務組成,
此階段也會去建立、配置task及相關信息。
根據gradle命令傳遞過來的task名稱,執行相關依賴任務。Task 的 Action 會在這個階段執行。
在上面講解了建立 task 的基本方式,其實 gradle api 給咱們提供了其餘的方式建立 task ,下面講解其餘兩種方式。
build.gradle
//建立 hello2 task tasks.create("hello2"){ doFirst { println "hello2+++++" } }
class MyTask extends DefaultTask { @TaskAction void action(){ println "action1+++++" } } //建立 hello3 task task hello3 (type: MyTask){ doLast{ println "action2+++++" } }
運行 hello3 task: gradlew hello3
輸出
action1+++++
action2+++++
build.gradle
task task1 << { println "我是task1----" } task task2 << { println "我是task2----" } //task2 依賴 task1, 執行task2以前先執行task1 task2.dependsOn task1
執行 task2
gradlew task2
執行效果
我是task1----
我是task2----
task task1 << { println "我是task1----" } task task2 << { println "我是task2----" } //task2 運行以前先運行task1 task2.mustRunAfter task1
執行 task1 : gradlew task1
我是task1----
執行 task2 : gradlew task2
我是task2----
同時執行 task一、task2 : gradlew task1 task2
我是task1----
我是task2----
build.gradle
task task1 << { println "我是task1----" } task task2 << { println "我是task2----" } task task3 << { println "我是task3----" } task2.mustRunAfter task1 task3.mustRunAfter task1
執行 gradlew task1 task2 task3
我是task1----
我是task2----
我是task3----
執行 gradlew task1 task3 task2
我是task1----
我是task3----
我是task1----
在出現語法矛盾的狀況下,依賴關係造成閉環,編譯器會報錯
task1.mustRunAfter task2 task2.mustRunAfter task1
造成依賴關係無關緊要。
build.gradle
task task1 << { println "我是task1----" } task task2 << { println "我是task2----" } task1.shouldRunAfter task2
運行: gradlew task1 task2
我是task2----
我是task1----
在出現語法矛盾的狀況下,依賴關係造成閉環,會自動打破閉環。不會報錯
gradle 默認提供了不少 task 給咱們使用,好比 copy、delete
build.gradle
task 任務的名字 (type: Copy) { //action }
//數據源目錄,多個目錄 public AbstractCopyTask from(Object... sourcePaths) //目標目錄,單一 public AbstractCopyTask into(Object destDir) //過濾文件 包含 public AbstractCopyTask include(String... includes) //過濾文件 排除 public AbstractCopyTask exclude(String... excludes) //從新命名,老名字 新名字 public AbstractCopyTask rename(String sourceRegEx, String replaceWith) //刪除文件 Project 接口 boolean delete(Object... paths);
task copyImage(type: Copy) { from 'C:\\Users\\yiba_zyj\\Desktop\\gradle\\copy' into 'C:\\Users\\yiba_zyj\\Desktop' }
task copyImage(type: Copy) { from 'C:\\Users\\yiba_zyj\\Desktop\\gradle\\copy' , 'C:\\Users\\yiba_zyj\\Desktop\\gradle\\copy' into 'C:\\Users\\yiba_zyj\\Desktop' }
只會複製後綴爲 .jpg 的文件
task copyImage(type: Copy) { from 'C:\\Users\\yiba_zyj\\Desktop\\gradle\\copy' into 'C:\\Users\\yiba_zyj\\Desktop' include "*.jpg" }
task copyImage(type: Copy) { from 'C:\\Users\\yiba_zyj\\Desktop\\gradle\\copy' into 'C:\\Users\\yiba_zyj\\Desktop' include "*.jpg" exclude "image1.jpg" rename("image2.jpg","123.jpg") }
文件覆蓋規則
相同文件覆蓋
Copy 類的繼承圖
Copy (類) - AbstractCopyTask (抽象類) (from、 into、 include、rename) -ConventionTask(抽象類) - DefaultTask (類) - AbstractTask (抽象類) - TaskInternal (接口) - Task(接口) -Comparable<Task>, ExtensionAware(接口) -Project(接口) (delete 方法)
build.gradle
task deleteFile(type: Delete) { //刪除Android 更目錄的aaa 文件 delete '../aaa' }
build.gradle
task deleteFile(type: Delete) { //刪除系統桌面 delete delete "C:\\Users\\yiba_zyj\\Desktop\\gradle\\delete" }
build.gradle
task deleteFile{ //do some things }
運行
gradlew dF 等價 gradlew deleteFile
打包時候運行 gradlew assembleRelease
,能夠簡寫成 gradlew aR
查看項目全部默認自帶的 task,不包括自定義 task
gradlew tasks
查看全部 task (默認 task + 自定義task)
gradlew tasks --all
查看某個 task 的相關信息,這些結果包含了任務的路徑、類型以及描述信息等
gradlew help --task taskName
查看 gradle 版本
gradlew -version
task task1 << { description = "這是一段描述信息" println "我是task1----" }
在上面的介紹中,運行 task 的方式是用 gradlew
, 那咱們怎麼用 gradle
。若是在終端運行 gradle
就會提示 gradle 不是內部或外部命令,也不是可運行的程序或批處理文件。
'gradle' 不是內部或外部命令,也不是可運行的程序或批處理文件。
官網下載:http://services.gradle.org/distributions/
下載完成後,我將壓縮包解壓放在 d 盤的 soft 目錄中。
環境變量
D:\soft\gradle-4.3-all
Path
D:\soft\gradle-4.3-all\gradle-4.3\bin
我的微信號:zhaoyanjun125 , 歡迎關注