构建脚本要素之task

10 篇文章 0 订阅
10 篇文章 1 订阅

学习文档参考 官网

概述

官网给出的概念是:任务代表一个构建的单个原子块,例如编译类或生成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”.

  • 使用 “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对象。
  • RegularFilePropertyDirectoryProperty
  • 一个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<Action>
antAntBuilder.可以使用它运行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)设置此任务的属性。该方法在以下位置搜索具有给定名称的属性,并在找到该属性的第一个位置设置该属性。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值