Gradle 构建脚本描述一个或多个项目。每个项目都由不同的任务组成。任务是构建执行的一项工作。任务可以是编译一些类,将类文件存储到单独的目标文件夹中,创建 JAR,生成 Javadoc 或将一些归档发布到存储库。
定义任务
任务是用于将任务定义到构建脚本中的关键字。看看下面的例子,它是一个叫作 hello 的任务,将打印一个字符串:hello world
。将以下脚本复制并保存到 build.gradle
文件中。此构建脚本定义一个名称为 “hello” 的任务,用于打印hello world
字符串。
task hello {
doLast {
println 'hello world'
}
}
在存储 build.gradle
文件的目录位置执行以下命令,应该看到输出结果如下 -
D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q hello
hello world
可以通过为 doLast
语句指定快捷方式(表示符号 <<
)来简化此 hello
任务。如果添加这个快捷方式到上面的 hello 任务中,参考如下脚本。
task hello << {
println 'hello world'
}
在存储 build.gradle
文件的目录位置执行以下命令,应该看到输出结果如下 -
D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q hello
hello world
任务依赖关系
您可能已经猜到,可以声明依赖于其他任务的任务。下面声明依赖于其他任务的任务,将以下代码复制并保存到build.gradle
文件中。
task hello << {
println 'Hello world!'
}
task intro(dependsOn: hello) << {
println "I'm Gradle"
}
在存储 build.gradle
文件的目录位置执行以下命令,应该看到输出结果如下 -
D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q intro
Hello world!
I'm Gradle
要添加依赖关系,相应的任务不需要存在。懒依赖 - 其他任务不存在,将以下代码复制并保存到build.gradle
文件中。
task taskX(dependsOn: 'taskY') << {
println 'taskX'
}
task taskY << {
println 'taskY'
}
在存储 build.gradle
文件的目录位置执行以下命令,应该看到输出结果如下 -
D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q taskX
taskY
taskX
定位任务
如果要查找在构建文件中定义的任务,则必须使用相应的标准项目属性。这意味着每个任务都可以作为项目的属性,使用任务名称作为属性名称。
看看下面的代码访问任务作为属性。将以下代码复制并保存到build.gradle
文件中。
task hello
println hello.name
println project.hello.name
在存储 build.gradle
文件的目录位置执行以下命令,应该看到输出结果如下 -
D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q hello
hello
hello
您还可以通过任务集合使用所有属性。
将以下代码复制并保存到build.gradle
文件中。
task hello
println tasks.hello.name
println tasks['hello'].name
在存储 build.gradle
文件的目录位置执行以下命令,应该看到输出结果如下 -
D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q hello
hello
hello
向任务添加依赖关系
要将一个任务依赖于另一个任务,这意味着当一个任务完成时,另一个任务将开始。每个任务都使用任务名称进行区分。任务名称集合由其任务集合引用。要引用另一个项目中的任务,应该使用项目路径作为相应任务名称的前缀。
以下示例将从任务taskX
添加依赖项到任务taskY
。
task taskX << {
println 'taskX'
}
task taskY(dependsOn: 'taskX') << {
println "taskY"
}
在存储 build.gradle
文件的目录位置执行以下命令,应该看到输出结果如下 -
D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q taskY
taskX
taskY
上面的例子是通过使用名字添加对任务的依赖。还有另一种方法实现任务依赖性,即使用 Task 对象定义依赖性。
现在采用上面任务的相同示例,但是使用任务对象而不是任务参考名称来实现依懒关系。
将以下代码复制并保存到build.gradle
文件中。
task taskY << {
println 'taskY'
}
task taskX << {
println 'taskX'
}
taskY.dependsOn taskX
在存储 build.gradle
文件的目录位置执行以下命令,应该看到输出结果如下 -
D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q taskY
taskX
taskY
还有另一种方法来添加任务依赖,它就是通过使用闭包。在这种情况下,任务通过闭包释放如果您在构建脚本中使用闭包,那么应该返回任务对象的单个任务或集合。以下示例将任务中从taskX
添加依赖项到项目中的所有任务,其名称以“lib
”开头。
将以下代码复制并保存到build.gradle
文件中。
task taskX << {
println 'taskX'
}
taskX.dependsOn {
tasks.findAll {
task -> task.name.startsWith('lib')
}
}
task lib1 << {
println 'lib1'
}
task lib2 << {
println 'lib2'
}
task notALib << {
println 'notALib'
}
在存储 build.gradle
文件的目录位置执行以下命令,应该看到输出结果如下 -
D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q taskX
lib1
lib2
taskX
向任务添加描述
可以向任务添加描述。执行Gradle
任务时会显示此描述。这可以通过使用description
关键字。
将以下代码复制并保存到build.gradle
文件中。
task copy(type: Copy) {
description 'Copies the resource directory to the target directory.'
from 'resources'
into 'target'
include('**/*.txt', '**/*.xml', '**/*.properties')
println("description applied")
}
在存储 build.gradle
文件的目录位置执行以下命令,应该看到输出结果如下 -
D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q taskX
description applied
跳过任务
如果用于跳过任务的逻辑不能用谓词表示,则可以使用StopExecutionException
。如果操作抛出此异常,则会跳过此操作的进一步执行以及此任务的任何后续操作的执行。构建继续执行下一个任务。
将以下代码复制并保存到build.gradle
文件中。
task compile << {
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') << {
println 'I am not affected'
}
在存储 build.gradle
文件的目录位置执行以下命令,应该看到输出结果如下 -
D:/worksp/yiibai.com/gradle-3.1/study/script>gradle -q myTask
I am not affected
Gradle 在处理任务时有不同的阶段。首先,有一个配置阶段,其中直接在任务的闭包中指定的代码被执行。针对每个可用任务执行配置块,而不仅针对稍后实际执行的那些任务。
参考 -
- https://docs.gradle.org/current/userguide/more_about_tasks.html
- https://docs.gradle.org/current/userguide/tutorial_using_tasks.html