Gradle任务


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

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

定义任务

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

task hello {
   doLast {
      println 'CodingDict'
   }
}

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

C:\> gradle q hello

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

CodingDict

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

task hello << {
   println 'codingdict'
}

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

下面是定义任务的一些变化,请看看它。以下示例定义了一个任务 hello

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

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

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

C:\> gradle q hello

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

CodingDict

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

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

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

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

C:\> gradle q hello

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

CodingDict

您还可以使用替代语法来定义任务。这是使用create()方法来定义一个任务。看看同样的Hello示例。

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

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

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

C:\> gradle q hello

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

CodingDict

查找任务

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

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

将以下代码复制并保存到 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

还有另一种方法可以为任务添加依赖关系,即通过使用闭包。在这种情况下,任务通过关闭被释放。如果在构建脚本中使用closure,该脚本应返回单个任务或任务对象的集合。以下示例将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文件的位置执行此操作。

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 闭包内的代码。