Gradle Task详解——自定义任务和任务依赖

Task 是 Gradle 构建的基本单元,理解 Task 的创建、配置和执行是掌握 Gradle 的关键。

创建 Task

// 最简方式
task hello {
    doLast {
        println 'Hello Gradle!'
    }
}

// 等价写法
task hello {
    doLast {
        println 'Hello Gradle!'
    }
}

doLast 在任务执行阶段运行。doFirst 在任务执行前运行:

task build {
    doFirst {
        println '构建开始...'
    }
    doLast {
        println '构建完成!'
    }
}

任务依赖

task compile {
    doLast { println '编译...' }
}

task test {
    dependsOn compile    // test 依赖 compile
    doLast { println '测试...' }
}

task deploy {
    dependsOn test       // deploy 依赖 test
    doLast { println '部署...' }
}

执行 gradle deploy 会依次执行 compile → test → deploy。

多个依赖:

task checkAll {
    dependsOn unitTest, integrationTest, lintCheck
}

动态创建 Task

4.times { i ->
    task "step${i}" {
        doLast {
            println "执行步骤 ${i}"
        }
    }
}

条件跳过

task deploy {
    onlyIf {
        project.hasProperty('doDeploy')
    }
    doLast {
        println '部署到服务器...'
    }
}

执行:gradle deploy -PdoDeploy

配置阶段 vs 执行阶段

task example {
    println '配置阶段执行'    // 任何时候都会执行

    doLast {
        println '执行阶段执行'  // 只有任务被触发时才执行
    }
}

即使运行 gradle help,配置阶段的代码也会执行。这就是为什么耗时操作要放在 doLast 里。

Task 类型

Gradle 内置了许多 Task 类型:

// 复制文件
task copyConfig(type: Copy) {
    from 'src/config'
    into 'build/config'
}

// 删除文件
task cleanBuild(type: Delete) {
    delete 'build'
}

// 执行命令
task runScript(type: Exec) {
    commandLine 'python', 'script.py'
}

// 打 zip 包
task packageApp(type: Zip) {
    from 'build/libs'
    archiveFileName = 'app.zip'
    destinationDirectory = file('dist')
}

查看所有任务

gradle tasks --all

指定任务执行顺序(不建立依赖)

task A {
    doLast { println 'A' }
}
task B {
    mustRunAfter A      // B 必须在 A 之后,但不是依赖
    doLast { println 'B' }
}

gradle A B 执行顺序是 A → B。但单独 gradle B 不会触发 A。

每天前进一小步,就是一个新的高度!

作者:唐明

出处:/post/gradle-task

版权:本站使用"CC BY 4.0"创作共享协议,转载请在文章明显位置注明作者及出处。

关注微信公众号

DevOps持续交付公众号ID:devopscd