title: Gradle (四)任务date: 2021-06-19 23:02:59.669

updated: 2021-06-20 14:31:34.165
url: /?p=251
categories: Gradle
tags: gradle

任务

简介

Gradle 构建脚本描述一个或多个项目,每个项目都由不同的任务组成。

任务是构建执行的一项工作,可以是编译一些类,将类文件存储到单独的目标文件夹中,创建 JAR ,生成 Javadoc 或将一些归档发布到存储库。

定义任务

任务是用于将任务定义到构建脚本中的关键字。此脚本创建了一个名为fristGradle的任务:

1
2
3
4
5
task fristGradle{
doLast{
println 'hello world,fristGradle'
}
}

在当前目录下执行命令:

1
2
D:\development_coding\GradleTest> gradle -q fristGradle
hello world,fristGradle

定位任务

如果要查找在构建文件中定义的任务,则必须使用相应的标准项目属性。这意味着每个任务都可以作为项目的属性,使用任务名称作为属性名称。

看看下面的代码访问任务作为属性。将以下代码复制并保存到 build.gradle 文件中。

1
2
3
4
task fristTask

println fristTask.name
println project.fristTask.name

build.gradle文件的目录下,执行如下命令:

1
2
3
D:\development_coding\GradleTest> gradle -q fristTask
fristTask
fristTask

还可以通过 tasks (任务集合) 使用所有属性

将以下代码复制并保存到 build.gradle 文件中。

1
2
3
4
5
6
task fristTask
task fristTask2

println fristTask.name
println tasks['fristTask'].name
println tasks['fristTask2'].name

build.gradle文件的目录下,执行如下命令:

1
2
3
4
D:\development_coding\GradleTest> gradle -q fristTask
fristTask
fristTask
fristTask2

依赖关系

build.gradle代码修改成如下:

1
2
3
4
5
6
7
8
9
10
11
12
task fristGradle{
doLast{
println 'hello world,fristGradle'
}
}

// dependsOn: taskName
task secondGradle(dependsOn:fristGradle){
doLast{
println 'secondGradle'
}
}

执行脚本如下:

1
2
3
D:\development_coding\GradleTest> gradle -q secondGradle
hello world,fristGradle
secondGradle

另外一种形式实现任务依赖

build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
task task1{
doLast{
println 'hello task1'
}
}

task task2{
doLast{
println 'hello task2'
}
}

task1.dependsOn task2

输出:

1
2
3
D:\development_coding\GradleTest> gradle -q task1
hello task2
hello task1

通过闭包,添加依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
task taskName{
doLast{
println 'hello task1'
}
}

taskName.dependsOn {
tasks.findAll{
task -> task.name.startsWith('lib')
}
}


task lib1{
doLast{
println 'hello lib1'
}
}

task lib2{
doLast{
println 'hello lib2'
}
}


task lib3{
doLast{
println 'hello lib3'
}
}

task noLib{
doLast{
println 'hello noLib'
}

}

输出:

1
2
3
4
5
D:\development_coding\GradleTest> gradle -q taskName
hello lib1
hello lib2
hello lib3
hello task1

task之间能否相互依赖?

1
2
3
4
5
6
7
8
9
10
11
task fristGradle(dependsOn:secondGradle){
doLast{
println 'hello world,fristGradle'
}
}
// dependsOn: taskName
task secondGradle(dependsOn:fristGradle){
doLast{
println 'secondGradle'
}
}

emmm,直接报错。所以 task 之间的不能相互依赖。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PS D:\development_coding\GradleTest> gradle -q fristGradle 

FAILURE: Build failed with an exception.

* Where:
Build file 'D:\development_coding\GradleTest\build.gradle' line: 2

* What went wrong:
A problem occurred evaluating root project 'GradleTest'.
> Could not get unknown property 'secondGradle' for root project 'GradleTest' of type org.gradle.api.Project.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 2s

跳过任务

如果用于跳过任务的逻辑不能用谓词表示,则可以使用StopExecutionException。如果操作抛出此异常,则会跳过此操作的进一步执行以及此任务的任何后续操作的执行, 构建继续执行下一个任务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
task compile {
doLast{
println 'We are doing the compile.'
}
}

compile.doFirst {
// Here you would put arbitrary conditions in real life.
// But this is used in an integration test so we want defined behavior.
if (true) { throw new StopExecutionException() }
}

task myTask(dependsOn: 'compile') {
doLast{
println 'I am not affected'
}
}
1
2
PS D:\development_coding\GradleTest> gradle -q myTask  
I am not affected