📜  Gradle-任务

📅  最后修改于: 2020-10-16 02:41:29             🧑  作者: Mango


Gradle构建脚本描述了一个或多个项目。每个项目由不同的任务组成。任务是构建执行的一项工作。任务可能是编译一些类,将类文件存储到单独的目标文件夹中,创建JAR,生成Javadoc或将一些成果发布到存储库。

本章介绍什么是任务以及如何生成和执行任务。

定义任务

Task是用于将任务定义到构建脚本中的关键字。看下面的示例,该示例表示一个名为hello的任务,该任务将打印tutorialspoint 。将以下脚本复制并保存到名为build.gradle的文件中。该构建脚本定义了一个任务名称hello,用于打印tutorialspoint字符串。

task hello {
   doLast {
      println 'tutorialspoint'
   }
}

在命令提示符下执行以下命令。它执行上面的脚本。您应该在build.gradle文件存储的位置执行此操作。

C:\> gradle –q hello

输出:

tutorialspoint

您可以通过指定doLast语句的快捷方式(表示符号<< )来简化此hello任务。如果将此快捷方式添加到上述任务招呼它看起来像下面的脚本。

task hello << {
   println 'tutorialspoint'
}

您可以使用gradle –q hello命令执行上述脚本。

这里是定义任务的一些变体,请看一下。以下示例定义了一个任务hello

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

task (hello) << {
   println "tutorialspoint"
}

在命令提示符下执行以下命令。它执行上面给定的脚本。您应该在build.gradle文件存储的位置执行此操作。

C:\> gradle –q hello

输出:

tutorialspoint

您也可以使用字符串作为任务名称。看一下相同的例子。在这里,我们将使用String作为任务。

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

task('hello') << {
   println "tutorialspoint"
}

在命令提示符下执行以下命令。它执行上面给定的脚本。您应该在build.gradle文件存储的位置执行此操作。

C:\> gradle –q hello

输出:

tutorialspoint

您还可以使用其他语法来定义任务。那就是使用create()方法来定义任务。看下面给出的相同的例子。

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

tasks.create(name: 'hello') << {
   println "tutorialspoint"
}

在命令提示符下执行以下命令。它执行上面给定的脚本。您应该在build.gradle文件存储的位置执行此操作。

C:\> gradle –q hello

输出:

tutorialspoint

定位任务

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

查看下面的代码,这些代码将任务作为属性访问。

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

task hello

println hello.name
println project.hello.name

在命令提示符下执行以下命令。它执行上面给定的脚本。您应该在build.gradle文件存储的位置执行此操作。

C:\> gradle –q hello

输出:

hello
hello

您还可以通过任务集合使用所有属性。

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

task hello

println tasks.hello.name
println tasks['hello'].name

在命令提示符下执行以下命令。它执行上面给定的脚本。您应该在build.gradle文件存储的位置执行此操作。

C:\> gradle –q hello

输出:

hello
hello

您还可以使用任务访问任务的路径。为此,您可以使用任务名称,相对路径或绝对路径来调用getByPath()方法。

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

project(':projectA') {
   task hello
}
task hello

println tasks.getByPath('hello').path
println tasks.getByPath(':hello').path
println tasks.getByPath('projectA:hello').path
println tasks.getByPath(':projectA:hello').path

在命令提示符下执行以下命令。它执行上面给定的脚本。您应该在build.gradle文件存储的位置执行此操作。

C:\> gradle –q hello

输出:

:hello
:hello
:projectA:hello
:projectA:hello

向任务添加依赖项

您可以使一个任务依赖于另一个任务,这意味着当一个任务完成时,只有其他任务才能启动。每个任务都用任务名称区分。任务名称的集合由其任务集合引用。要引用另一个项目中的任务,您应该使用项目的路径作为相应任务名称的前缀。

以下示例将taskX的依赖项添加到taskY。

将以下给定的代码复制并保存到build.gradle文件中。看一下下面的代码。

task taskX << {
   println 'taskX'
}
task taskY(dependsOn: 'taskX') << {
   println "taskY"
}

在命令提示符下执行以下命令。它执行上面给定的脚本。您应该在build.gradle文件存储的位置执行此操作。

C:\> gradle –q taskY

输出:

taskX
taskY

上面的示例通过使用任务名称来添加对任务的依赖关系。实现任务依赖关系的另一种方法是使用Task对象定义依赖关系。

让我们以taskY依赖于taskX的相同示例为例,但是我们使用的是任务对象而不是任务引用名称。

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

task taskY << {
   println 'taskY'
}
task taskX << {
   println 'taskX'
}
taskY.dependsOn taskX

在命令提示符下执行以下命令。您应该在存储build.gradle文件的地方执行此操作。

C:\> gradle –q taskY

输出:

taskX
taskY

上面的示例通过使用任务名称来添加对任务的依赖关系。实现任务依赖关系的另一种方法是使用Task对象定义依赖关系。

在这里,我们以同一示例为例,taskY依赖于taskX,但是我们使用任务对象而不是任务引用名称。看一看。

将以下给定的代码复制并保存到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文件存储的位置执行此操作。

C:\> 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文件的地方执行此操作。

C:\> gradle –q copy

如果命令执行成功,您将获得以下输出。

description applied

跳过任务

跳过任务可以通过传递谓词闭包来完成。仅当任务的方法或闭包在执行任务的实际工作之前抛出StopExecutionException时,才可能这样做。

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

task eclipse << {
   println 'Hello Eclipse'
}

// #1st approach - closure returning true, if the task should be executed, false if not.
eclipse.onlyIf {
   project.hasProperty('usingEclipse')
}

// #2nd approach - alternatively throw an StopExecutionException() like this
eclipse.doFirst {
   if(!usingEclipse) {
      throw new StopExecutionException()
   }
}

在命令提示符下执行以下命令。您应该在存储build.gradle文件的地方执行此操作。

C:\> gradle –q eclipse

任务结构

在处理任务时,Gradle具有不同的阶段。首先,有一个配置阶段,在该阶段执行直接在任务闭包中指定的代码。对每个可用任务执行配置块,不仅对以后实际执行的那些任务执行。

在配置阶段之后,执行阶段将在实际执行的那些任务的doFirstdoLast闭包内运行代码。