概述
任务入门
定义任务
任务属于一个Project对象,并且每个任务都可以执行task接口。定义一个新任务的最简单方式是,执行将任务名称作为其参数的任务方法:
task hello
其创建了任务,但当你执行时,它不会做任何事情。为了创建一个有用的任务,你需要添加一些动作。初学者通常会犯的一个错误是像下面这样创建任务:
task hello{
println 'Hello , world!'
}
当你执行该任务时,会看到输出如下:
$ gradlew hello
Hello , world!
:hello
从输出来看,你可能觉得该任务运行了,但实际上,“Hello , world!”在执行该任务之前就已经被打印出来了。
原因就是,在任意Gradle构建中,都有三个阶段:初始化阶段、配置阶段和执行阶段。而上述的任务则是设置了任务的配置。
如果你想在执行阶段给一个任务添加动作,则应该使用下面的表示法:
task hello << {
println 'Hello , world'
}
唯一的不同就是closure之前的<<,其告知Gradle,代码在执行阶段执行,而不是在配置阶段。
Task在Gradle中有很多简写,在Gradle中定义任务的常用方式有以下几种:
task(hello) << {
println 'Hello , world!'
}
task('hello') << {
println 'Hello ,world!'
}
tasks.create(name: 'hello') << {
println 'Hello , world!'
}
任务剖析
Task接口是所有任务的基础,其定义了一系列属性和方法。所有这些都是由一个叫做DefaultTask的类实现的。这是标准的任务实现方式,你创建的每一个新的任务,都是基于DefaultTask的。
每个任务都包含一个Action对象的集合。当一个任务被执行时,所有这些动作会以连续的顺序被执行。你可以使用doFirst()和doLast()方法来为一个任务添加动作。这些方法都是以一个closure作为参数,然后被包装到一个Action对象中的。
task hello {
println 'Configuration'
doLast {
println 'Goodbye'
}
doFirst{
println 'hello'
}
}
当执行hello task时输出如下:
$ gradlew hello
Configuration
:hello
hello
Goodbye
即使打印“Goodbye”的代码在“Hello”的代码之前定义,但当执行task时,他们仍会按正确的顺序执行。你甚至可以多次使用doFirst()和doLast(),如下所示:
task mindTheOrder{
doFirst{
println 'Not really first'
}
doFirst{
println 'First!'
}
doLast{
println 'Not really last'
}
doLast{
println 'Last!'
}
}
执行这个task的输出如下:
$ gradlew mindTheOrder
:mindTheOrder
First!
Not really first.
Not really last.
Last!
注意,doFirst()总是添加一个动作到task的最前面,而doLast()总是添加一个动作到最后面,这意味着,当使用这些方法的时候,顺序很重要。
当涉及给tasks排序时,可以使用mustRunAfter方法.
当使用mustRunAfter()时,你需要指定,如果两个任务都被执行,那么必须有一个任务始终先执行。
task task1 <<{
println 'task1'
}
task task2 <<{
println 'task2'
}
task2.mustRunAfter task1
同时运行task1和task2,不管你指定了什么样的顺序,task1总是在task2之前执行。
gradlew task2 task1
:task1
task1
:task2
task2
在这两个任务之间,mustRunAfter()方法不会添加任何依赖,因而我们可以只执行task2而不执行task1。如果你需要一个任务依赖于另一个,那么可使用dependsOn()方法。
dependsOn()的例子
task task1 << {
println 'task1'
}
task task2 << {
println 'task2'
}
task2.dependsOn task1
当你试图只执行task2而不执行task1时,结果如下:
$ gradlew task2
:task1
task1
:task2
task2
使用mustRunAfter(),当同时执行task1和task2时,task1总是在task2之前执行,两者也可以独立执行。使用dependsOn(),即使在未明确提及的情况下,task2的执行也总是会触发task1.这是一个重要的区别。
最后
以上就是无聊香菇为你收集整理的Groovy之task语法的全部内容,希望文章能够帮你解决Groovy之task语法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复