Gradle任務
Gradle構建腳本描述一個或多個項目。每個項目都由不同的任務組成。任務是構建執行的一項工作。任務可以是編譯一些類,將類文件存儲到單獨的目標文件夾中,創建JAR,生成Javadoc或將一些歸檔發佈到存儲庫。
定義任務
任務是用於將任務定義到構建腳本中的關鍵字。看看下面的例子,它是一個叫作 hello 的任務,將打印一個字符串:hello world
。將以下腳本複製並保存到 build.gradle
文件中。 此構建腳本定義一個名稱爲 「hello」 的任務,用於打印hello world
字符串。
task hello {
doLast {
println 'hello world'
}
}
在存儲 build.gradle
文件的目錄位置執行以下命令,應該看到輸出結果如下 -
D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q hello
hello world
可以通過爲 doLast
語句指定快捷方式(表示符號 <<
)來簡化此 hello
任務。如果添加這個快捷方式到上面的 hello 任務中,參考如下腳本。
task hello << {
println 'hello world'
}
在存儲 build.gradle
文件的目錄位置執行以下命令,應該看到輸出結果如下 -
D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q hello
hello world
任務依賴關係
您可能已經猜到,可以聲明依賴於其他任務的任務。下面聲明依賴於其他任務的任務,將以下代碼複製並保存到build.gradle
文件中。
task hello << {
println 'Hello world!'
}
task intro(dependsOn: hello) << {
println "I'm Gradle"
}
在存儲 build.gradle
文件的目錄位置執行以下命令,應該看到輸出結果如下 -
D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q intro
Hello world!
I'm Gradle
要添加依賴關係,相應的任務不需要存在。懶依賴 - 其他任務不存在,將以下代碼複製並保存到build.gradle
文件中。
task taskX(dependsOn: 'taskY') << {
println 'taskX'
}
task taskY << {
println 'taskY'
}
在存儲 build.gradle
文件的目錄位置執行以下命令,應該看到輸出結果如下 -
D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q taskX
taskY
taskX
定位任務
如果要查找在構建文件中定義的任務,則必須使用相應的標準項目屬性。這意味着每個任務都可以作爲項目的屬性,使用任務名稱作爲屬性名稱。
看看下面的代碼訪問任務作爲屬性。將以下代碼複製並保存到build.gradle
文件中。
task hello
println hello.name
println project.hello.name
在存儲 build.gradle
文件的目錄位置執行以下命令,應該看到輸出結果如下 -
D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q hello
hello
hello
您還可以通過任務集合使用所有屬性。
將以下代碼複製並保存到build.gradle
文件中。
task hello
println tasks.hello.name
println tasks['hello'].name
在存儲 build.gradle
文件的目錄位置執行以下命令,應該看到輸出結果如下 -
D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q hello
hello
hello
向任務添加依賴關係
要將一個任務依賴於另一個任務,這意味着當一個任務完成時,另一個任務將開始。 每個任務都使用任務名稱進行區分。 任務名稱集合由其任務集合引用。 要引用另一個項目中的任務,應該使用項目路徑作爲相應任務名稱的前綴。
以下示例將從任務taskX
添加依賴項到任務taskY
。
task taskX << {
println 'taskX'
}
task taskY(dependsOn: 'taskX') << {
println "taskY"
}
在存儲 build.gradle
文件的目錄位置執行以下命令,應該看到輸出結果如下 -
D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q taskY
taskX
taskY
上面的例子是通過使用名字添加對任務的依賴。 還有另一種方法實現任務依賴性,即使用Task對象定義依賴性。
現在採用上面任務的相同示例,但是使用任務對象而不是任務參考名稱來實現依懶關係。
將以下代碼複製並保存到build.gradle
文件中。
task taskY << {
println 'taskY'
}
task taskX << {
println 'taskX'
}
taskY.dependsOn taskX
在存儲 build.gradle
文件的目錄位置執行以下命令,應該看到輸出結果如下 -
D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q taskY
taskX
taskY
還有另一種方法來添加任務依賴,它就是通過使用閉包。在這種情況下,任務通過閉包釋放如果您在構建腳本中使用閉包,那麼應該返回任務對象的單個任務或集合。以下示例將任務中從taskX
添加依賴項到項目中的所有任務,其名稱以「lib
」開頭。
將以下代碼複製並保存到build.gradle
文件中。
task taskX << {
println 'taskX'
}
taskX.dependsOn {
tasks.findAll {
task -> task.name.startsWith('lib')
}
}
task lib1 << {
println 'lib1'
}
task lib2 << {
println 'lib2'
}
task notALib << {
println 'notALib'
}
在存儲 build.gradle
文件的目錄位置執行以下命令,應該看到輸出結果如下 -
D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q taskX
lib1
lib2
taskX
向任務添加描述
可以向任務添加描述。 執行Gradle
任務時會顯示此描述。 這可以通過使用description
關鍵字。
將以下代碼複製並保存到build.gradle
文件中。
task copy(type: Copy) {
description 'Copies the resource directory to the target directory.'
from 'resources'
into 'target'
include('**/*.txt', '**/*.xml', '**/*.properties')
println("description applied")
}
在存儲 build.gradle
文件的目錄位置執行以下命令,應該看到輸出結果如下 -
D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q taskX
description applied
跳過任務
如果用於跳過任務的邏輯不能用謂詞表示,則可以使用StopExecutionException
。 如果操作拋出此異常,則會跳過此操作的進一步執行以及此任務的任何後續操作的執行。 構建繼續執行下一個任務。
將以下代碼複製並保存到build.gradle
文件中。
task compile << {
println 'We are doing the compile.'
}
compile.doFirst {
// Here you would put arbitrary conditions in real life.
// But this is used in an integration test so we want defined behavior.
if (true) { throw new StopExecutionException() }
}
task myTask(dependsOn: 'compile') << {
println 'I am not affected'
}
在存儲 build.gradle
文件的目錄位置執行以下命令,應該看到輸出結果如下 -
D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q myTask
I am not affected
Gradle在處理任務時有不同的階段。 首先,有一個配置階段,其中直接在任務的閉包中指定的代碼被執行。 針對每個可用任務執行配置塊,而不僅針對稍後實際執行的那些任務。