Gradle 项目和任务
gradle build 由一个或多个项目组成。 Gradle 中的一切都是基于项目和任务的。
Gradle 任务
在 Gradle 中,任务是构建执行的单个工作单元。这些任务可以是编译类、创建 JAR、生成 Javadoc 以及将一些档案发布到仓库等等。 它可以被视为构建过程的单个原子工作。
Gradle 的优势在于他的可扩展模型; 任务是这个模型的核心。 任务是 Gradle 运行的独立单元。 任务的本质是它的动作。 例如,我们可以声明一个任务来编译 Java 源代码或将一些数据从一个目录复制到另一个目录。 一个任务可以单独执行一些动作,但我们也可以声明对其他任务的依赖。 任务还可以定义它的输入和它读取和写入的文件的输出。 这允许 Gradle 确定是否需要完成任务。
Gradle 项目
在 Gradle 中,一个项目显示一个库 JAR 或一个 Web 应用程序。 它还可以提供一个分发 ZIP,该 ZIP 由其他项目生成的 JAR 组装而成。 一个项目可以将我们的应用程序部署到暂存或生产环境。 Gradle 中的每个项目都由一个或多个任务组成。我们可以将其与构建的示例联系起来; 它可以有任意数量的层。
任务类型
Gradle 中有两种类型的任务。 它们如下:
- 默认任务
- 自定义任务
默认任务
默认任务是 Gradle 的预定义任务。 我们可以在我们的项目中定义它。 Gradle 让我们定义一个或多个默认任务,如果没有指定其他任务则执行这些任务。
我们可以通过运行 gradle task
命令列出默认任务。 如下所示:
自定义任务
Gradle 允许我们创建任务; 这些任务称为自定义任务。 自定义任务是为执行某些特定工作而构建的用户定义任务。
语法
Task task_name{
group "-------group_name for task-------'
description '-------description of the task-------'
doLast{
-------code for execution-------
-----------------------------------
-----------------------------------
}
}
下面我们来创建一个任务。打开 build.gradle ,添加如下内容
task jiyik_task{
group "Custom task"
description "迹忆客 Gradle Custom task Example."
doLast{
println "Welcome to 迹忆客. It is a Custom task Example.";
}
}
然后我们继续使用 gradle task
命令来查看我们的任务
现在,要执行我们的自定义任务,运行命令 gradle taskname
(因为taskname是 jiyik_task,所以实际命令为 gradle jiyik_task
)。 看下面的输出:
使用 DSL 特定语法定义任务
在新文件夹中,使用以下代码创建 build.gradle 文件(使用 Groovy DSL 编写)或 build.gradle.kts 文件(使用 Kotlin DSL 编写):
tasks.register("hello") {
doLast {
println 'Hello, World!'
}
}
上面的 Groovy 代码将注册一个名为 hello 的新必需任务,并将消息打印到控制台。
保存文件并运行以下命令:
$ gradle tasks --all
我们的新任务将出现在其他任务下。
使用字符串作为任务名称定义任务:
我们可以使用字符串作为任务名称来定义任务。 例如,我们要定义一个任务名称 'hello',将以下代码放入 build.gradle 文件中:
task('hello') {
doLast {
println "hello"
}
}
task('copy', type: Copy) {
from(file('srcDir'))
into(buildDir)
}
还有另一种定义任务的方法(我们也可以使用任务容器来定义任务)。
使用任务容器定义任务
TaskContainer
管理一组 Task 实例。 我们可以通过调用 Project.getTasks()
来访问 TaskContainer
实例,也可以在构建脚本中使用 tasks 属性。
我们看下TaskContainer的定义:
public interface TaskContainer extends TaskCollection<Task>, PolymorphicDomainObjectContainer<Task>
使用 TaskContainer
定义任务的“hello world”示例如下:
tasks.create('hello') {
doLast {
println "hello"
}
}
tasks.create('copy', Copy) {
from(file('srcDir'))
into(buildDir)
}
在这里,我们可以将任务添加到任务集合中。
自定义任务中的 doFirst 和 doLast 块
在 Gradle 中,doFirst
和 doLast
是两个不同的自定义任务块。 这些块在块部分内定义。 在 doFirst
块中,我们确定要首先执行的任务,而 doLast
块用于最后运行任务。 考虑下面的代码片段:
task A{
doFirst{
println "Hello welcome to 迹忆客"
}
doLast{
println "Thank You Bye Bye."
}
}
执行上面的任务,我们可以看到下面的输出结果。
在 Gradle 中复制任务
Gradle 允许我们将任务从一个目录复制到另一个目录。 以下语法用于复制任务:
task task_name(type: Copy){
From "--------------------DirectoryPath----------------"
Into " --------------------DirectoryPath----------------"
}
任务分组
在 Gradle 中,我们可以对任务进行分组。 为了对任务进行分组,我们将为所有任务使用相同的组名。 要对名为 jiyik1 和 jiyik2 的两个任务进行分组,请将以下代码写入 build.gradle 文件:
task jiyik1{
group "jiyik_task"
doLast{
println "This is a task 1."
}
}
task jiyik2{
group "jiyik_task"
doLast{
println "This is a task 2."
}
}
跳过任务
在 Gradle 中,有多种方法可以跳过任务的执行。 要跳过任务,请将 onlyIf()
附加到任务代码。 考虑下面的代码片段:
task jiyik1{
group "jiyik_task1"
doLast{
println "This is a task."
}
}
jiyik1.onlyIf{
project.hasProperty('doOperation')
}
使用谓词跳过任务
在 Gradle 中,onlyif()
方法可以附加一个谓词。 在这种情况下,任务仅在谓词为真时执行。 谓词实现为闭包,并通过参数传递。 如果任务被执行,则返回 true,否则返回 false。 如果任务被跳过。 谓词在任务之前进行评估。 考虑下面的代码片段:
task test_Jiyik{
group "Task1"
doLast{
println "This is a task."
}
}
test_Jiyik.onlyIf{
!project.hasProperty('skipTest')
}
使用 StopExecutionException 跳过任务
在 Gradle 中,我们还可以使用 StopExecutionException
而不是谓词跳过任务。 如果这个异常被抛出到一个任务中,则跳过该任务的动作,并且构建继续执行下一个任务。 考虑下面的代码片段:
task compile{
doLast{
println "Here we are compiling"
}
}
compile.doFirst{
if (true)
{
throw new StopExecutionException()
}
}
task Javatpoint (dependsOn: 'compile') {
doLast{
println 'i am not affected'
}
}
启用和禁用任务
Gradle 允许我们启用和禁用任务; 默认情况下,它是启用的。 要禁用任务,我们必须将其标记为已跳过。 考虑下面的代码片段:
task jiyik_disableTask{
doLast{
println "this statement should not be printed if the task is disabled."
}
}
jiyik_disableTask.enabled = false
Gradle 中的任务依赖
当一个任务依赖于另一个任务时使用任务依赖。 dependsOn
关键字与任务名称一起使用以使任务依赖。
考虑下面的示例,它包含两个名为 jiyikOperation1 和 jiyikOperation2 的任务。 第二个任务与第一个任务有'depends on'
关键字,这意味着第二个任务只有在第一个任务成功执行时才会执行:
task jiyikOperation1{
group "CustomTasks"
doLast{
println "This is operation 1 of Jiyik"
}
}
task jiyikOperation2(dependsOn: 'javatpointOperation1'){
group "CustomTasks"
doLast{
println "This is operation 2 of Jiyik"
}
}
Gradle 中任务的快捷方式表示法
我们可以创建现有任务的快捷方式,每个任务都被视为构建脚本的属性。 为此,请在 build.gradle 文件中添加以下代码片段。
task Jiyik {
doLast {
println 'Hello world!'
}
}
Jiyik.doLast {
println "Greetings from the $Jiyik.name task."
}
任务中的自定义属性
在 Gradle 中,我们可以创建属性并将其添加到任务中。 要添加属性,请将 ext.myProperty
设置为任务的初始值。 考虑下面的代码片段:
task JiyikTask {
ext.myProperty = "This is a custom property"
}
task printTask {
doLast {
println JiyikTask.myProperty
}
}