task 结构、生命周期#
到现在为止,已经介绍了 gralde 作为通用构建系统的那部分功能。
这部分功能几乎与 Make 是等价的,只不过它多了 Project 的概念,然后 task 多了 doFirst , doLast,以及通过 jvm 实现跨平台。
所以,如果只是这样的话,gradle 也会遇到和 Make 一样的问题: 任务组织比较混乱。所以,gradle 提供了两种方式来突出主要任务: 默认任务、构建周期。
默认任务#
每个 Project 都有默认任务,通过 defaultTasks
函数指定. 如果直接不带参数运行 gradle, 则会运行默认任务。
例如:
// build.gradle.kts
// 设置 clean/run 为默认任务
defaultTasks("clean", "run")
tasks.register("clean") {
doLast {
println("Default Cleaning!")
}
}
tasks.register("run") {
doLast {
println("Default Running!")
}
}
tasks.register("other") {
doLast {
println("I'm not a default task!")
}
}
> gradle -q
Default Cleaning!
Default Running!
生命周期任务(Lifecycle Tasks)#
概念#
生命周期任务是 gradle 定义的一系列标准任务名称,例如我们常用的:
run: 运行
build: 构建
如此一来,无论我们构建的是 java 还是 c++ 项目,都可以通过 gradle run
进行启动, gradle build
进行构建
生命周期任务本身 并不会做任何事情 ,只是为了让其他任务附加到上面。 举个例子,假设项目构建时需要把配置文件拷贝到 dist, 就可以这么写:
tasks.register<Copy>("copyConfig") {
from("config/config.json")
into("$buildDir/config.json")
}
tasks.named("build") {
dependsOn("copyConfig")
}
生命周期任务#
生命周期任务 定义在 Base Plugin 中,所有的 gradle plugin 几乎都要实现这些标准任务,比如 java plugin
.
所有生命周期任务如下:
clean
递归删除构建目录以及其中的所有文件。具体的目录路径可以通过 Project.getBuildDir() 获取到。
check — lifecycle task
用于附加其他项目检查任务,如 lint/unittest 等。 用户执行 gradle check 执行所有检查
assemble — lifecycle task
所有用于生产最终产物的的任务都应该汇总到 assemble,例如 java plugin 的 jar 任务会创建 jar 包产物, 因此 jar 任务就会被绑定到 assemble ,通过 assemble.dependsOn(task) 将其他 task 绑定到 assemble。
build — lifecycle task
依赖 check, assemble 任务。用于绑定所有构建动作,包括跑完所有测试,构建最终产物,生成文档。 一般很少在 build 上直接附加其他任务,通常附加到 check/assemble 上更合适一点。
buildConfiguration — task rule
执行所有当前 Configuration 的依赖项。例如,buildArchives 会执行 archives 任务的所有依赖项。
cleanTask — task rule
约定每个任务可以定义一个自己的 clean 任务,用于删除当前任务的输出,例如在 java plugin 中 cleanJar 任务可以删除 jar 任务的所有输出