三、Task 编写和使用

一、Gradle 基础
二、Gradle 构建
三、Task 编写和使用
四、Plugin 编写和使用


文章目录

  • Task 编写和使用
    • 1. task 注册和配置
    • 2. 动态创建 task
    • 3. task 之间的依赖
    • 4. task 跳过
    • 5. 自定义task

Task 编写和使用

三、Task 编写和使用_第1张图片
Task 我们可以看成⼀个个任务,这个任务可以是编译 java 代码、编译 C/C++ 代码、编译资源⽂件⽣成对应的 R ⽂件、打包⽣成 jar库⽂件、签名、图⽚压缩、打包⽣成 APK ⽂件、包/资源发布等。每⼀个 Task 任务都是为了实现某个⽬的,可以理解为⼀个步骤,最终⼀个个步骤按序执⾏就完成了整个项⽬构建。

// 1. 使用 Project.task 注册和配置 task
task("helloworld") {
    println("Hello World Configuring")
    doFirst {
        println("Hello World Do First")
    }
    doLast {
        println("Hello World Do Last")
    }
}
// 2. 使用 TaskContainer register 和 named 注册和配置 task
tasks.register("DependedTask")
tasks.named("DependedTask") {
    def taskName = it.name
    doLast {
        println("executing ${taskName}")
    }
}
// 3. 使用 TaskContainer register 和 TaskProvider.configure 注册和配置 task
def mustRunAfterTask = tasks.register("MustRunAfterTask")
mustRunAfterTask.configure {
    def taskName = it.name
    doLast {
        println("executing MustRunAfterTask")
    }
}

(0..11).each { i ->
    tasks.register("DynamicallyCreatedTask_" + i) { // 8. 动态创建 task
        group = "DynamicallyCreatedTask" // 4. 设置 task group 属性
        description = "dynamically created tasks" // // 5. 设置 task description 属性
        def taskName = it.name
        doLast { // 6. 执行阶段 task 运行代码
            println("executing " + taskName)
        }

        doFirst { // 6. 执行阶段 task 运行代码
            if (i % 2 == 1) {
                def toThrowExceptionProvider = providers.gradleProperty("toThrowException")
                def toThrowException = toThrowExceptionProvider.getOrNull()
                if (toThrowException == 'true') { // 9. 跳过任务之抛出 StopExecutionException 异常
                    throw new StopExecutionException("to throw stop execution exception")
                }
            }
        }
        println("configuration ${taskName}") // 7. configuration 阶段 task 运行代码
        if (i % 2 == 0) {
            dependsOn("DependedTask") // 8. 任务之间依赖
            mustRunAfter("MustRunAfterTask") // 8. 任务之间依赖
        } else {
            def toDisableProvider = providers.gradleProperty("toDisable")
            if (toDisableProvider.getOrNull() == 'true') { // 9. 跳过任务之设置 enabled 为 false
                enabled = false
            }
            def toSkipProvider = providers.gradleProperty("toSkip")
            onlyIf("toSkip property equals true") { // 9. 跳过任务之使用 onlyIf
                !(toSkipProvider.getOrNull() == 'true')
            }
        }
    }
}

abstract class MyTask extends DefaultTask { // 10. 自定义 task 继承 DefaultTask
    @Input // 12. 定义 task 输入
    def fileText = getProject().providers.gradleProperty("fileText")

    @Input
    def fileName = "myfile.txt"

    @OutputFile // 13. 定义 task 输出
    def myFile = new File(fileName)

    @TaskAction
    def action() { // 11. 自定义 task action 按照定义顺序逆序执行
        println("write myfile.txt")
        myFile.createNewFile()
        myFile.write(fileText.getOrElse("empty"))
    }

    @TaskAction
    def doAction1() { // 11. 自定义 task action 按照定义顺序逆序执行
        println("${this.class.name}: excuting Action1")
    }

    @TaskAction
    def doAction2() { // 11. 自定义 task action 按照定义顺序逆序执行
        println("${this.class.name}: excuting Action2")
    }
}

tasks.register("createFileTask", MyTask.class) {
    group = "custom"
    description = "Create myfile.txt in the current directory"
}

tasks.named("createFileTask", MyTask.class) {
    fileText.getOrElse("HELLO FROM THE NAMED METHOD")
}

1. task 注册和配置

  1. 注释1:使用 Project.task 注册和配置 task;

  2. 注释2:使用 TaskContainer registernamed 注册和配置 task

  3. 注释3:使用 TaskContainer registerTaskProvider.configure 注册和配置 task

    C:\Users\12588\OneDrive\AndroidStudioProjects\learnGradle>gradlew helloworld DependedTask MustRunAfterTask
    
    > Configure project :app
    Hello World Configuring
    
    > Task :app:helloworld
    Hello World Do First
    Hello World Do Last
    
    > Task :app:DependedTask
    executing DependedTask
    
    > Task :app:MustRunAfterTask
    executing MustRunAfterTask
    
    BUILD SUCCESSFUL in 783ms
    3 actionable tasks: 3 executed
    

2. 动态创建 task

  1. 注释8:动态创建 task;

  2. 注释6:执行阶段 task 运行代码;

  3. 注释7:configuration 阶段 task 运行代码;

    C:\Users\12588\OneDrive\AndroidStudioProjects\learnGradle>gradlew DynamicallyCreatedTask_1
    
    > Configure project :app  # 配置阶段 task 运行代码
    Hello World Configuring
    configuration DynamicallyCreatedTask_1
    
    > Task :app:DynamicallyCreatedTask_1 # 运行阶段 task 运行代码
    executing DynamicallyCreatedTask_1
    
    BUILD SUCCESSFUL in 717ms
    1 actionable task: 1 executed
    

3. task 之间的依赖

  1. 注释8:任务之间依赖,任务之间可以依赖,常见的依赖:dependsOnmustRunAftershouldRunAfter

    C:\Users\12588\OneDrive\AndroidStudioProjects\learnGradle>gradlew DynamicallyCreatedTask_6 MustRunAfterTask
    
    > Configure project :app
    Hello World Configuring
    configuration DynamicallyCreatedTask_6
    
    > Task :app:MustRunAfterTask
    executing MustRunAfterTask
    
    > Task :app:DependedTask # DependedTask 在 DynamicallyCreatedTask_6 之前运行,哪怕没有指定运行
    executing DependedTask
    
    > Task :app:DynamicallyCreatedTask_6 # DynamicallyCreatedTask_6 在 MustRunAfterTask 后运行,哪怕 DynamicallyCreatedTask_6 定义运行顺序在 MustRunAfterTask 之前 
    executing DynamicallyCreatedTask_6
    
    BUILD SUCCESSFUL in 744ms
    3 actionable tasks: 3 executed
    

4. task 跳过

  1. 任务跳过有三种方式:抛出 StopExecutionException 异常;设置 enabledfalse;使用onlyIf

    C:\Users\12588\OneDrive\AndroidStudioProjects\learnGradle>gradlew DynamicallyCreatedTask_6 DynamicallyCreatedTask_5 -PtoSkip=true
    
    > Configure project :app
    Hello World Configuring
    configuration DynamicallyCreatedTask_6
    configuration DynamicallyCreatedTask_5 # 执行阶段跳过执行 DynamicallyCreatedTask_5,只在配置阶段执行
    
    > Task :app:DependedTask
    executing DependedTask
    
    > Task :app:DynamicallyCreatedTask_6 
    executing DynamicallyCreatedTask_6
    
    BUILD SUCCESSFUL in 826ms
    2 actionable tasks: 2 executed
    
    

5. 自定义task

  1. 注释10:自定义 task 继承 DefaultTask

  2. 注释11:自定义 task action 按照定义顺序逆序执行;

  3. 注释12:@input定义 task 输入;

  4. 注释13:@output定义 task 输入;

    C:\Users\12588\OneDrive\AndroidStudioProjects\learnGradle>gradlew createFileTask -PfileText="file text hello gradle"
    
    > Configure project :app
    Hello World Configuring
    
    > Task :app:createFileTask
    MyTask_Decorated: excuting Action1 # 自定义 task action 按照定义顺序逆序执行
    MyTask_Decorated: excuting Action2
    write myfile.txt
    
    BUILD SUCCESSFUL in 791ms
    1 actionable task: 1 executed
    

你可能感兴趣的:(其他,gradle)