学习文档参考 官网
官网给出的概念是:任务代表一个构建的单个原子块,例如编译类或生成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确保了所有的任务依赖和排序规则在执行任务时都能被执行,这样任务就会在所有的依赖项和任何”必须运行的任务之后”执行。用于指定任务之间的排序
有两种可用的排序规则: “must 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的例子中将任务的顺序调换一下,执行就会报错。
可以使用以下任何类型的对象来指定依赖项和排序
一个插件可以使用它的约定对象向任务添加方法,常用插件有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) | 设置此任务的属性。该方法在以下位置搜索具有给定名称的属性,并在找到该属性的第一个位置设置该属性。 |