Gradle 任务
-
任务
Gradle构建脚本描述了一个或多个项目。每个项目由不同的任务组成。任务是构建执行的一项工作。任务可能是编译一些类,将类文件存储到单独的目标文件夹中,创建JAR,生成Javadoc或将一些成果发布到存储库。本章介绍什么是任务以及如何生成和执行任务。 -
定义任务
Task是用于将任务定义到构建脚本中的关键字。看一下以下示例,该示例表示一个名为hello的任务,该任务将打印jc2182。将以下脚本复制并保存到名为build.gradle的文件中。此构建脚本定义了一个任务名称hello,用于打印jc2182字符串。task hello { doLast { println 'jc2182' } }
在命令提示符下执行以下命令。它执行上面的脚本。您应该执行此操作,将build.gradle文件存储在其中。C:\> gradle –q hello
输出:jc2182
-
定位任务
如果要查找在构建文件中定义的任务,则必须使用相应的标准项目属性。这意味着可以使用任务名称作为属性名称,将每个任务用作项目的属性。查看下面的代码,这些代码将任务作为属性访问。将以下给定的代码复制并保存到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
C:\> gradle –q hello
输出::hello :hello :projectA:hello :projectA:hello
-
向任务添加依赖项
您可以使一个任务依赖于另一个任务,这意味着当一个任务完成时,只有其他任务才能启动。每个任务都用任务名称区分。任务名称的集合由其任务集合引用。要引用另一个项目中的任务,您应该使用项目的路径作为相应任务名称的前缀。以下示例将taskX的依赖项添加到taskY。将以下给定的代码复制并保存到build.gradle文件中。看一下下面的代码。task taskX { doLast { println 'taskX' } } task taskY(dependsOn: 'taskX') { doLast{ println "taskY" } }
在命令提示符下执行以下命令。它执行上面给定的脚本。您应该在build.gradle文件存储的位置执行此操作。C:\> gradle –q taskY
输出:taskX taskY
上面的示例使用名称来添加对任务的依赖。实现任务依赖关系的另一种方法是使用Task对象定义依赖关系。让我们以taskY依赖于taskX的相同示例为例,但是我们使用任务对象而不是任务引用名称。将以下代码复制并保存到build.gradle文件中。task taskY { doLast{ println 'taskY' } } task taskX { doLast{ println 'taskX' } } taskY.dependsOn taskX
C:\> gradle –q taskY
输出:taskX taskY
上面的示例使用名称来添加对任务的依赖。实现任务依赖关系的另一种方法是使用Task对象定义依赖关系。在这里,我们以同一示例为例,taskY依赖于taskX,但是我们使用的是任务对象而不是任务引用名称。看一看。将以下给定的代码复制并保存到build.gradle文件中。看一下下面的代码。task taskX { doLast{ println 'taskX' } } taskX.dependsOn { tasks.findAll { task -> task.name.startsWith('lib') } } task lib1 { doLast{ println 'lib1' } } task lib2 { doLast{ println 'lib2' } } task notALib { doLast{ println 'notALib' } }
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 { doLast{ 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具有不同的阶段。首先,有一个配置阶段,在该阶段执行直接在任务闭包中指定的代码。对每个可用任务执行配置块,不仅对以后实际执行的那些任务执行。在配置阶段之后,执行阶段在那些实际执行的任务的doFirst或doLast闭包内运行代码。