柚子快報(bào)激活碼778899分享:gradle Task 詳解
柚子快報(bào)激活碼778899分享:gradle Task 詳解
目錄
Task定義和配置
Task的執(zhí)行階段
Task 的依賴(lài)
Task 指定執(zhí)行順序
Task 主gradle引入其他的gradle文件
將某一個(gè)task掛載到指定的task之后執(zhí)行
gradle task官網(wǎng):Task - Gradle DSL
Task定義和配置
查看工程下所有的task,使用如下命令
gradle tasks
定義一個(gè)task
task創(chuàng)建的源碼
參數(shù)分別是 task 名稱(chēng),和一個(gè) closure。groovy語(yǔ)法的closure可以寫(xiě)在小括號(hào)外面,小括號(hào)可以省略
task的源碼
public interface Task extends Comparable
String TASK_NAME = "name";
String TASK_DESCRIPTION = "description";
String TASK_GROUP = "group";
String TASK_TYPE = "type";
// 指定當(dāng)前task的依賴(lài)的其他task
String TASK_DEPENDS_ON = "dependsOn";
// 重寫(xiě) task
String TASK_OVERWRITE = "overwrite";
// 配置 task 任務(wù)邏輯
String TASK_ACTION = "action";
// 構(gòu)造參數(shù)
String TASK_CONSTRUCTOR_ARGS = "constructorArgs";
}
語(yǔ)法
task 自定義task名稱(chēng)
示例
task mytask {
println "hello task."
}
執(zhí)行自定義task
./gradle mytask
定義task也可以使用上面源碼中的?TaskContainer 方式創(chuàng)建一個(gè)task
示例
this.tasks.create('mytask2') {
println "hello task2."
}
給 task 添加分組
示例
// 給 自定義task 添加group 和 desc
// 示例一
task mytask1(group: "testGroup", description: "is am a test") {
println "hello task1."
}
// 示例二
task mytask2 {
setGroup("testGroup")
setDescription("is am a test")
}
?添加分組的 task,在idea gradle項(xiàng)中會(huì)放在一個(gè)新組中,沒(méi)有分組的自定義task會(huì)放在 other 中
Task的執(zhí)行階段
關(guān)于gradle的階段請(qǐng)查看:gradle生命周期
配置階段
普通定義的task都是在配置階段都會(huì)被執(zhí)行。
執(zhí)行階段
執(zhí)行階段就是特意使用了 gradle xxx 的方式指定某一個(gè)task執(zhí)行。taks才會(huì)執(zhí)行。其他命令task不會(huì)執(zhí)行。
執(zhí)行階段的task,在配置階段不會(huì)被執(zhí)行。只有task才能在執(zhí)行階段被執(zhí)行。使用如下兩個(gè)函數(shù),讓 task 在gradle 執(zhí)行階段執(zhí)行
doFirst:在task之前添加邏輯 // 在?@TaskAction 前面執(zhí)行注解:@TaskAction,使用該注解的自定義task類(lèi)中的代碼也會(huì)在執(zhí)行階段執(zhí)行
doLast:在task之后添加邏輯,(<< 表示 doLast,但是在gradle5.0版本中被移除) //?// 在?@TaskAction 后面執(zhí)行
示例
// 示例一
task testTask(group: "testGroup", description: "is am a test") {
doFirst {
println "hello doFirst. " + group
}
}
// 示例二
testTask.doLast {
println "hello doLast. " + description
}
// 示例三 << 表示 doLast,在gradle 5.0版本中 << 符號(hào)被移除
task testTask2 << {
println "hello doLast."
}
Task 的依賴(lài)
有3個(gè)task,taskA、taskB、taskC,taskA依賴(lài)taskB、taskC
//task taskA(dependsOn:"taskB"){ // 一個(gè)依賴(lài)的寫(xiě)法
// 被依賴(lài)的task定義在當(dāng)前task后面,dependsOn參數(shù)要使用字符串""的方式
//task taskA(dependsOn:["taskB", "taskC"]){ // 多個(gè)依賴(lài)的寫(xiě)法
// doLast {
// println "taskA"
// }
//}
task taskB {
doLast {
println "taskB"
}
}
task taskC {
doLast {
println "taskC"
}
}
// 被依賴(lài)的task在當(dāng)前task之前,dependsOn參數(shù)可以直接使用變量的方式
task taskA(dependsOn:taskB){
doLast {
println "taskA"
}
}
// 或者使用這種方式
//taskA.dependsOn([taskB, taskC])
為task添加指定前綴的task依賴(lài)
task libA {
doLast{
println "libA"
}
}
task libB {
doLast {
println "libB"
}
}
// 被依賴(lài)的要定義在前面,不然找不到
task taskTest {
dependsOn this.tasks.findAll { task ->
return task.name.startsWith("lib")
}
doLast {
println "taskTest = " + dependsOn
}
}
Task 指定執(zhí)行順序
有3個(gè)task,taskA、taskB、taskC,讓task按照 A、B、C的順序依次執(zhí)行
task taskA {
doLast {
println "taskA"
}
}
task taskB {
mustRunAfter taskA // 可以使用數(shù)組參數(shù)
doLast {
println "taskB"
}
}
task taskC {
mustRunAfter taskB
doLast {
println "taskC"
}
}
執(zhí)行命令:gradle taskB?taskC taskA?
Task 主gradle引入其他的gradle文件
有一個(gè) a.gradle 文件,如果需要讓該文件生效。需要在主gradle文件中引用a.gradle
語(yǔ)法
apply from: 文件路徑
示例
apply from: this.rootProject.file("a.gradle")
將某一個(gè)task掛載到指定的task之后執(zhí)行
例如:在 task build 執(zhí)行完成之后,接著自動(dòng)執(zhí)行 task a
this.afterEvaluate { org.gradle.api.Project project ->
// 找到 build task
def buildTask = project.tasks.getByName('build')
if (buildTask == null) {
throw GradleException("build task is not found.")
}
// 執(zhí)行 build task 之后的 taskA
buildTask.finalizedBy "taskA"
}
task taskA {
doLast {
println "taskA"
}
}
柚子快報(bào)激活碼778899分享:gradle Task 詳解
參考文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。