• 创建Task的多种方法


    Gradle的Project从本质上说只是含有多个Task的容器,一个Task与Ant的Target相似,表示一个逻辑上的执行单元。

    我们可以通过多种方式定义Task,所有的Task都存放在Project的TaskContainer中。

    (1)调用Project的task()方法创建Task

    在使用Gradle时,创建Task最常见的方式便是:

    task hello1 << {
        println 'hello1'
    }

    这里的“<<”表示追加的意思,即向hello1中计入执行过程。我们还可以使用doLast来达到同样的效果:

    task hello2 {
        doLast {
            println 'hello2'
        }
    }

    另外,如果需要向Task的最前面加入执行过程,我们可以使用doFirst

    task hello3 {
        doFirst {
            println 'hello3'
        }
    }

    上面的 Gradle 的 DSL 实际上是一种内部的 DSL 。task关键字实际上是一个方法调用,该方法属于Project。Project存在多个重载的 task()方法。在调用 groovy 方法时,我们可以不用将参数放在括号内。

    上面三个自定义的Task都位于TaskContainer中,Project中的tasks属性表示该TaskContainer。

    我们可以新建一个Task来显示这些信息:

    task showTasks {
    
        println tasks.class
    
        println tasks.size()
    
    }

    在第一章中的 build.gradle 中加入 showTasks,再执行 gradle showTasks ,命令行输出如下:

    上面的 DefaultTaskContainer_Decorated 表示 tasks 类型。而5表示自定义的 task,包括 showTasks 本身。

    (2)通过 TaskContainer 的 create() 方法创建 Task。

    TaskContainer 提供了大量重载的 create() 方法用于添加 Task。

    task.create(name: 'hello4') << {
        println 'hello4'
    }

    (3)声明Task之间的依赖关系

    Task之间是可以存在依赖关系,比如TaskA依赖TaskB,那么在执行TaskA时,Gradle会先执行TaskB,在执行TaskA,我们可以在定义一个Task的同时声明它的依赖关系:

    task hello5(dependsOn: hello4)<< {
        println 'hello5'    
    }

    当然,我们也可以在定义Task之后再声明依赖:

    task hello6 << {
       println 'hello6'
    }
    
    hello6.dependsOn hello5

    (4)配置Task

    一个Task除了执行操作之外,还包含了多个Property。其中Gradle为每个Task默认定义的Property。比如description,logger等。

    另外每一个特定的Task还可以含有特定的Property,比如Copy的from和to等。

    也可以动态地向Task中加入额外的Property。在执行一个Task前,我们通常都需要先设定Property的值,Gradle提供了多种方法设置Task的Property的值。

    首先,我们可以在定义Task的时候对Property进行配置:

    task hello7 << {
        description = "this is hello7"
        println description
    }

    我们还可以通过闭包的方式来配置一个已有的Task:

    task hello8 << {
        println description
    }
    
    hello8 {
        description = "this is hello8"
    }

    实际上对于hello8的description发生在创建该Task后,执行gradle hello8时,依然能够正确的打印出 this is hello8 。这是因为 gradle 在执行 Task 时分为两个阶段:配置阶段、执行阶段。执行 hello8 前,会先扫描整个build.gradle文档,然后设置属性,再执行 hello8。

    还可以通过configure()完成Property的设置:

    task hello9 << {
        println description
    }
    
    hello9.configure {
        description = "this is hello9"
    }

    实际上,通过闭包的方法配置Task在内部也是通过调用Task的configuration方法完成的,对此将在后面讲。

  • 相关阅读:
    密文搜索
    poj 1182 食物链
    1147. Heaps (30)
    1146. Topological Order (25)
    1145. Hashing
    1142. Maximal Clique (25)
    fzu 2112 tickets
    51nod 1554 欧姆诺姆和项链
    codeforces 963B Destruction of a Tree
    hdu 3294 Girls' research
  • 原文地址:https://www.cnblogs.com/lilinzhiyu/p/8524708.html
Copyright © 2020-2023  润新知