构建脚本要素之task

学习文档参考 官网

概述

官网给出的概念是:任务代表一个构建的单个原子块,例如编译类或生成javadoc
每个任务都属于一个项目。可以使用TaskContainer(该接口可自行深入了解)上的各种方法来创建和查找任务实例。如,TaskContainer.create(java.lang.String)创建一个带有给定名称的空任务。还可以在构建文件中使用任务关键字

task myTask
task myTask { configure closure }
task myTask(type: SomeType)
task myTask(type: SomeType) { configure closure }

每个任务都有一个名称,所属项目中的其他任务可以对其引用,以及一个完全限定的路径,它在所有项目中的所有任务中是唯一的。路径是拥有项目的路径和任务的名称的连接。路径元素使用:字符分隔

奉上几个例子~

//以下四种等效
task simpleTaskName{
    doLast{
        println "simpleTask"
    }
}
使用了doLast的简写形式
task(simpleTaskName2) << {
    println "simpleTaskName2"
}
使用字符串定义任务名称
task('simpleTaskName3') <<
{
    println "simpleTaskName3"
}
使用TaskContainer构造函数,参考上面的连接
tasks.create(name: 'simpleTaskName4') << {
    println "simpleTaskName4"
}
//增加入参,将当前目录中a文件夹复制到b文件夹中
task(copy, type: Copy) {
    from(file('a'))
    into('b')
}

任务组成

任务由一系列的行为语句组成,它们按顺序逐一执行。可以为任务加入doFirst和doLast动作相当于初始化和销毁,当然这两个动作可以灵活运用,使用:taskName.doFirst 和 taskName.doLast进行控制,还可以使用groovy闭包

doFirst(org.gradle.api.Action)
doFirst(groovy.lang.Closure)

task simpleTask{
    doLast{
        println "doLast destory"
    }

    doFirst{
        println "do First init"
    }
}
//使用任务名称操作
simpleTask.doLast{
    println "out"
}

//使用指定类型 Closure 声明一个闭包
Closure callfirst = { println 'Closure first!' } 
Closure calllast = { println 'Closure last!' } 

//def closureWithArgs = { a,b -> a+b } 

task simpleTaskgroovy{
    doLast{
        callfirst()
    }
    //另外一种调用方式call()
    doFirst{
        calllast.call()
    }
}

任务依赖和排序

一个任务可能依赖于其他任务,或者计划在另一个任务之后一直运行。Gradle确保了所有的任务依赖和排序规则在执行任务时都能被执行,这样任务就会在所有的依赖项和任何”必须运行的任务之后”执行。用于指定任务之间的排序

  • Task.dependsOn(java.lang.Object[])
  • Task.setDependsOn(java.lang.Iterable)
  • Task.mustRunAfter(java.lang.Object[])
  • Task.setMustRunAfter(java.lang.Iterable)
  • Task.shouldRunAfter(java.lang.Object[])
  • Task.setShouldRunAfter(java.lang.Iterable)

有两种可用的排序规则: “must run after” 和 “should run after”.

  • 使用 “must run after” 时即意味着任务要先后执行;
  • 使用”should run after” 规则与 “must run after” 类似, 只是没有那么的严格, 在两种情况下它会被忽略:
    • 使用规则来阐述一个执行的循环.
    • 当并行执行并且一个任务的所有依赖除了 “should run after” 任务其余都满足了, 那么这个任务无论它的 “should run after” 依赖是否执行, 它都可以执行.
    • 总之, 当要求不是那么严格时, “should run after” 是非常有用的.

使用mustRunAfter示例

task taskRun << {
    println 'taskRun'
}
task taskBeforeRun << {
    println 'taskBeforeRun'
}

taskRun.mustRunAfter taskBeforeRun
c:\>gradle -i taskBeforeRun taskRun
Initialized native services in: 
……
Selected primary task 'taskBeforeRun' from project :
Selected primary task 'taskRun' from project :
Tasks to be executed: [task ':taskBeforeRun', task ':taskRun']
:taskBeforeRun (Thread[main,5,main]) started.
:taskBeforeRun
Task ':taskBeforeRun' is not up-to-date because:
  Task has not declared any outputs.
taskBeforeRun
:taskBeforeRun (Thread[main,5,main]) completed. Took 0.015 secs.
:taskRun (Thread[main,5,main]) started.
:taskRun
Task ':taskRun' is not up-to-date because:
  Task has not declared any outputs.
taskRun
:taskRun (Thread[main,5,main]) completed. Took 0.001 secs.
……

使用shouldRunAfter 示例


task taskRun << {
    println 'taskRun'
}
task taskBeforeRun << {
    println 'taskBeforeRun'
}

//taskRun.mustRunAfter taskBeforeRun
taskRun.shouldRunAfter taskBeforeRun
c:\>gradle -q taskRun taskBeforeRun
taskBeforeRun
taskRun

1、注意这两个例子使用的mustRunAfter 、shouldRunAfter
2、另外就是命令行中任务的顺序,这个才是!!要点!!!,若在mustRunAfter的例子中将任务的顺序调换一下,执行就会报错。

可以使用以下任何类型的对象来指定依赖项和排序

  • 一个字符串,CharSequence或groovy.lang.GString任务路径或名称。相对于任务的项目,相对路径被解释。这允许在其他项目中引用任务。
  • 一个任务 task。
  • 一个闭包。闭包可能将任务作为参数。它可以返回这里列出的任何类型。它的返回值递归地转换为任务。null返回值被当作一个空集合处理。
  • 一个TaskDependency对象。
  • 一个Buildable对象。
  • RegularFileProperty或DirectoryProperty。
  • 一个Iterable, Collection, Map 或 array。可以包含这里列出的任何一种类型。iterable/collection/map/array 递归转换成任务。
  • 一个Callable。call()方法可以返回这里列出的任何类型。它的返回值递归地转换为任务。null返回值被视为一个空集合

动态方法

一个插件可以使用它的约定对象向任务添加方法,常用插件有java、war、groovy、sonar等。具体使用时可以参考TaskTypes ,根据任务类型再去寻找合适插件。

定位任务

每一个任务都必须是一个 project 的有效属性, 使用任务名来作为属性名。更详细的资料TaskContainer

直接上例子~

apply plugin: 'java'

task simpleTask{

    //doLast和doFirst方法
    doLast{
        println "doLast destory"
    }

    doFirst{
        println "do First init"
    }

}
//通过属性获取 tasks
println simpleTask.name
println project.simpleTask.name

//通过 tasks collection 获取 tasks
println tasks.simpleTask.name
println tasks['simpleTask'].name

//通过路径获取 tasks
println tasks.getByPath('simpleTask').path
println tasks.getByPath(':simpleTask').path
c:\>gradle -q simpleTask
simpleTask
simpleTask
simpleTask
simpleTask
:simpleTask
:simpleTask
do First init
doLast destory

属性和方法的应用

挑几个属性和方法演示一下,下面有全量属性和方法的说明

apply plugin: 'java'

task simpleTask{

    //doLast和doFirst方法
    doLast{
        println "doLast destory"
    }

    doFirst{
        println "do First init"
    }



    //属性演示
    print "simpleTask's actions:"+simpleTask.actions

    println "simpleTask's status:"+simpleTask.enabled

    println "simpleTask's finalizedBy.getDependencies():"+simpleTask.finalizedBy.getDependencies()

    println "simpleTask belongs project:"+simpleTask.project

    println "simpleTask.convention.getPlugins():"+simpleTask.convention.getPlugins()

    println "simpleTask.inputs.getHasInputs():"+simpleTask.inputs.getHasInputs()

    println "simpleTask.outputs.getHasOutput():"+simpleTask.outputs.getHasOutput()



    println "simpleTask.mustRunAfter.getDependencies():"+simpleTask.mustRunAfter.getDependencies(simpleTask)


    println "simpleTask.state:"+simpleTask.state.getUpToDate()
}
task simpleExtendTask{

    //设置依赖
    simpleExtendTask.dependsOn(simpleTask)

    //依赖属性
    println "simpleExtendTask dependsOn:"+simpleExtendTask.dependsOn


    println "simpleExtendTask.inputs.getHasInputs():"+simpleExtendTask.inputs.getHasInputs()

    println "simpleExtendTask.mustRunAfter.getDependencies():"+simpleExtendTask.mustRunAfter.getDependencies(simpleExtendTask)
}

task afterRun{
    doLast{
        println "xxxxxxxxxxxxxxx"
    }
}
simpleExtendTask.mustRunAfter afterRun
c:\>gradle -q afterRun simpleExtendTask
simpleTask's actions:[org.gradle.api.internal.AbstractTask$ClosureTaskAction@d13baac, org.gradle.api.internal.AbstractTask$ClosureTaskAction@4c302f38]simpleTask's status:true
simpleTask's finalizedBy.getDependencies():[]
simpleTask belongs project:root project ''
simpleTask.convention.getPlugins():[:]
simpleTask.inputs.getHasInputs():false
simpleTask.outputs.getHasOutput():false
simpleTask.mustRunAfter.getDependencies():[]
simpleTask.state:false
simpleExtendTask dependsOn:[task ':simpleTask']
simpleExtendTask.inputs.getHasInputs():false
simpleExtendTask.mustRunAfter.getDependencies():[]
xxxxxxxxxxxxxxx
do First init
doLast destory
c:\>

属性

属性 描述 返回类型
actions 任务所有操作的序列,按执行顺序列出 List
ant AntBuilder.可以使用它运行ant任务(只读) AntBuilder
convention 任务的约定对象。一个插件可以使用约定对象为任务增加额外可用的属性和方法 (只读) Convention
dependsOn 任务依赖列表信息 Set
description 任务描述信息 String
didWork 检查任务是否完成了工作。即使一个任务被执行,它也可能决定它没有什么可做的。例如,编译任务可能会确定源文件自上次运行任务以来没有发生变化。 boolean
enabled 返回任务是否有效 boolean
extensions 执行的容器 (只读) ExtensionContainer
finalizedBy 返回完成此任务的任务 TaskDependency
group 这个任务所属的任务组。当向用户显示任务列表时,任务组用于报告和用户界面,将相关任务分组在一起。 String
inputs 任务的输入(只读) TaskInputs
logger 这个任务的日志记录器。您可以在构建文件中使用该文件来编写日志消息(只读) Logger
logging 可以用来接收日志记录并控制该任务的标准输出/错误捕获的LoggingManager。默认情况下,系统。out被重定向到在安静日志级别和系统上的分级日志系统。错误被重定向到错误日志级别(只读) LoggingManager
mustRunAfter 返回这个任务必须运行的任务 TaskDependency
name 这个任务的名称。名称惟一地标识其项目中的任务(只读) String
outputs 任务的输出 (只读) TaskOutputs 对象
path 任务的路径,这是该任务的完全限定名称。任务的路径是它的项目的路径加上任务的名称,由:分割(只读) String
project 任务所属项目(只读) Project
state 这个任务的执行状态。这提供了关于该任务执行的信息,例如是否执行了,是否被跳过,是否已经失败等等。(只读) TaskState
taskDependencies 返回一个任务依赖项,其中包含该任务所依赖的所有任务(只读) TaskDependency
temporaryDir 返回这个任务可以用来编写临时文件的目录。每个任务实例都提供一个单独的临时目录。不能保证该目录的内容将被保存在执行任务之外(只读) File

方法

方法 描述
deleteAllActions() 删除任务的所有语句
dependsOn(paths) 添加任务依赖
doFirst(action) 将给定的闭包添加到该任务的动作列表的开始部分。闭包在执行时作为一个参数传递
doFirst(actionName, action) 将给定的动作添加到该任务的动作列表的开头
doLast(action) 将给定的闭包添加到该任务的动作列表的结尾部分。闭包在执行时作为一个参数传递
doLast(actionName, action) 将给定的动作添加到该任务的动作列表的结尾
finalizedBy(paths) 为该任务添加给定的终结器任务
hasProperty(propertyName) 判断任务是否拥有给定的属性
leftShift(action) 将给定的闭包添加到该任务的操作列表的末尾。闭包在执行时作为一个参数传递。您可以使用“左移”操作符从构建脚本中调用此方法
mustRunAfter(paths) 指定该任务必须在所有提供的任务之后运行。
onlyIf(onlyIfClosure) 仅当给定的闭包返回true时才执行该任务。闭包将在任务执行时进行评估,而不是在配置期间。这个闭包将传递一个参数,这个任务。如果闭包返回false,则将跳过该任务。
onlyIf(onlyIfSpec) 只有在指定的规范得到满足的情况下才执行任务。该规范将在任务执行时评估,而不是在配置期间。如果规范不满足,则将跳过该任务.
property(propertyName) 返回该任务的给定属性的值。这个方法定位一个属性如下:
setProperty(name, value) 设置此任务的属性。该方法在以下位置搜索具有给定名称的属性,并在找到该属性的第一个位置设置该属性。

你可能感兴趣的:(gradle,构建工具,gradle)