译:基于 Gradle 6.5.1 的文档翻译,点击此处访问原文
目录
Task(任务)是 Gradle 完成任务的基石。它们代表构建中的单个原子操作,例如创建一个 JAR 或者链接一个可执行程序。本指南将引导您使用小而精简的 Task 来完成您自定义的构建过程。
您将要创建什么
在开始您将会创建一个在控制台打印 Hello, World 的临时 Gradle task。然后,您将其配置为可打印任何消息。在此过程中,您将了解临时 task 和自定义 task 类型。
您需要做的准备
- 大概 8 分钟
- 一个文本编辑器或 IDE
一份 Java Development Kit (JDK)
- 如果使用 Gradle Groovy DSL 的话需要 JDK 7 或更高
- 如果使用 Gradle Kotlin DSL 的话需要 JDK 8 或更高
- Gradle V5.0 或更高版本
创建一个临时 task
在一个新的文件夹创建一个 build.gradle
文件(如果您更喜欢使用Groovy DSL),或者一个 build.gradle.kts
文件(如果您更喜欢使用Kotlin DSL)然后输入下面的代码
// build.gradle
tasks.register("hello") { /**①**/
doLast { /**②**/
println 'Hello, World!'
}
}
// build.gradle.kts
tasks.register("hello") { /**①**/
doLast { /**②**/
println("Hello, World!")
}
}
① 注册一个叫 hello
的临时 task
② 添加一个在控制台打印的 task action
保存这个文件并且在命令行输入 gradle tasks --all
。您的新 task 将会在Other tasks
之后出现。
验证您的任务已创建
$ gradle tasks --all
Other tasks
-----------
hello
如果您使用的是 Gradle 4.0 或之后的版本,您从控制台看到的输出可能会比本指南中看到的少。指南里的日志是 Gradle 在
--console-plain
也通过命令行传递给他的情况下输出的。这样做是为了显示 Gradle 正在执行的任务。
运行你的 task
执行您临时 task 的输出
$ gradle hello
:hello ①
Hello, World ②
① 这表示您的 hello
task 已执行。
② 这是您的临时 task 的输出。
恭喜你!您已经添加了第一个临时 task。
添加一个 task 描述
尽管您已经测试了新建的临时 task 并且知道了他是如何工作的,他是一个告诉将要使用我们构建脚本的人我们的 task 是做什么的不错的做法。这对任务进行分类也很有用。
当您运行 gradle tasks --all
时,早些时候您会在清单中看到其他 task,这些 task 包含描述并根据功能分组。同样(从Gradle 3.3开始),如果一个 task 没有一个组,除非指定了 --all
,否则它不会被列出。
有据可查的任务
Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.
这是通过在任务上设置组和描述属性来实现的。编辑您的临时 task 并添加以下内容:
// build.gradle
tasks.register("hello") {
group = 'Welcome'
description = 'Produces a greeting'
doLast {
println 'Hello, World'
}
}
// build.gradle.kts
tasks.register("hello") {
group = "Welcome"
description = "Produces a greeting"
doLast {
println("Hello, World")
}
}
再次运行 gradle tasks
。
'tasks' task 的输出
$ gradle tasks
Welcome tasks
-------------
hello - Produces a greeting
干得漂亮!
使输出可配置
这是您需要将临时 task 转换为自定义 task 类型的地方,这可以通过在构建脚本中创建一个类来实现。
回到您的构建脚本中并添加以下类并重构您的 hello
task。
// build.gradle
class Greeting extends DefaultTask { /**①②**/
String message /**③**/
String recipient
@TaskAction /**④**/
void sayGreeting() {
println "${message}, ${recipient}!" /**⑤**/
}
}
tasks.register("hello", Greeting) { /**⑥**/
group = 'Welcome'
description = 'Produces a world greeting'
message = 'Hello' /**⑦**/
recipient = 'World'
}
// build.gradle.kts
open class Greeting: DefaultTask() { /**①②**/
lateinit var message: String /**③**/
lateinit var recipient: String
@TaskAction /**④**/
fun sayGreeting() {
println("$message, $recipient!") /**⑤**/
}
}
tasks.register<Greeting>("hello") { /**⑥**/
group = "Welcome"
description = "Produces a world greeting"
message = "Hello" /**⑦**/
recipient = "World"
}
①:build.gradle
(resp. build.gradle.kts
) 的构建 DSL 是 Groovy-based DSL (resp. Kotlin-based) ,这个类是 Groovy (resp. Kotlin) 类
②:尽管可以在特定情况下使用 Gradle API 中的其他 task 类,但是继承 DefaultTask
是最常见的情况。
③:添加 message
和 recipient
,可以配置此自定义 task 类型的实例。
④:给 task 的默认 action 添加注解。
⑤:使用标准的 Groovy / Kotlin 输出打印消息。
⑥:使用泛型 Greeting
来指定 task 类型。
⑦: 配置 message 和 recipient。
测试您的修改。您应该看到相同的输出。
转换为自定义任务类型后的输出
$ gradle hello
:hello
Hello, World!
现在您完成了自定义 task 类型,您可以添加其他 task。另外创建一个 task 来添加问候语的德语版本。
// build.gradle
tasks.register("gutenTag", Greeting) {
group = 'Welcome'
description = 'Produces a German greeting'
message = 'Guten Tag'
recipient = 'Welt'
}
// build.gradle.kts
tasks.register<Greeting>("gutenTag") {
group = "Welcome"
description = "Produces a German greeting"
message = "Guten Tag"
recipient = "Welt"
}
再次运行 gradle tasks
以验证是否已添加新任务。
添加第二个 task 后 'gradle tasks' 的输出。
$ gradle tasks
Welcome tasks
-------------
gutenTag - Produces a German greeting
hello - Produces a world greeting
最后,通过执行 gradle gutenTag
运行新任务
第二项任务的输出。
$ gradle gutenTag
:gutenTag
Guten Tag, Welt!
总结
搞定!您已经通过这些必要的步骤创建了一个自定义的 Gradle Task。你现在应该已经学会了如何
- 注册一个临时的 task 并且通过
doLast
添加一个 action。 - 添加一个 task 描述。
- 将临时 task 转换为自定义 Gradle 任务类型并注册 task实例。
- 使用 @TaskAction 设置 task 的默认 action
接下来的步骤
- 在构建脚本里面添加类将很快导致混乱且可能无法维护构建脚本。了解如何组织构建逻辑。
- 阅读有关使用 task 以及预定义 task 和 task 类型的更多信息。
帮助改进这个指南
有意见或问题吗?找到错字了?像所有 Gradle 指南一样,寻求帮助只有 GitHub issue 这一种方法。请给 gradle/guides 提 issue 或 pr,我们将尽快与您联系。