Gradle - 任务

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

任务可能是编译一些类、将类文件存储到单独的目标文件夹、创建 JAR、生成 Javadoc 或将一些成果发布到存储库。

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


定义任务

Task 是一个关键字,用于将任务定义到构建脚本中。

看看下面的例子,它代表一个名为 hello 的任务,它打印 tutorialspoint。 将以下脚本复制并保存到名为 build.gradle 的文件中。

此构建脚本定义了一个任务名称 hello,用于打印 tutorialspoint 字符串。

task hello {
   doLast {
    println 'tutorialspoint'
   }
}

在命令提示符下执行以下命令。 它执行上面的脚本。 你应该执行这个,存储 build.gradle 文件的地方。

C:\> gradle –q hello

输出

\

下面给出的是代码的输出 −

tutorialspoint

您可以通过指定 doLast 语句的快捷方式(表示符号 <<)来简化此 hello 任务。 如果把这个快捷方式加到上面的任务 hello 中,会如下 −

task hello << {
   println 'tutorialspoint'
}

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

以下示例定义了一个任务 hello

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

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

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

C:\> gradle –q hello

输出

输出如下所示 −

tutorialspoint

您还可以使用字符串作为任务名称。 看看同样的 hello 示例。 这里我们将使用 String 作为任务。

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

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

在命令提示符下执行以下命令。 它执行上面提到的脚本。 你应该在 build.gradle 文件存储的地方执行这个。

C:\> gradle –q hello

输出

当你执行上面的代码时,你应该会看到如下输出 −

tutorialspoint

您还可以使用替代语法来定义任务。 也就是说,使用 create() 方法来定义一个任务。 看看下面给出的同一个 hello 示例。

复制下面给出的代码并将其保存到 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 闭包内的代码,这些任务实际上已被执行。