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