Gradle task

本文来自网易云社区

作者:孙有军

1:gradle脚本是使用groovy语言写的(DSL),groovy中有一个重要的概念闭包(Closure),Closure是一段单独的代码块,它可以接收参数,返回值,也可以被赋值给变量。eg:

//无参数def Closure1 = { println ‘Hello world‘ }
Closure1()// 执行闭包,输出Hello world//一个参数def Closure2 = { String str -> println str }//如果只有一个参数可以用it代替,写作def Closure2 = {println it}Closure2(‘Hello world‘)// 执行闭包,输出Hello world//多个参数def Closure3 = { String str,int n -> println “$str : $n" }//也可以写作 {str,n -> println “$str : $n" }
Closure3(‘Hello world’, 1)// 执行闭包,输出Hello world : 1

//使用变量
def var=“Hello world"
def Closure4 = { println var }//也可以写作 {str,n -> println “$str : $n" }
Closure4()// 执行闭包,输出Hello world

//改变上下文
def Closure5 = {println Var} //这时还不存在 
MyClass m = new MyClass()
Closure5.setDelegate(m)// 改变上下文,这时Var已经有了,在执行之前改变了,
Closure5()//执行闭包,输出Hello world

class MyClass {
    def Var = ‘Hello world‘
}

把closure当做参数传递
closure的好处就是可以传递给不同的方法,这样可以帮助我们解耦执行逻辑。前面的例子中已经展示了如何把closure传递给一个类的实例。下面我们将看一下各种接收closure作为参数的方法:

1.只接收一个参数,且参数是closure的方法: myMethod(myClosure)
2.如果方法只接收一个参数,括号可以省略: myMethod myClosure
3.可以使用内联的closure: myMethod {println ‘Hello World’}
4.接收两个参数的方法: myMethod(arg1, myClosure)
5.和4类似,单数closure是内联的: myMethod(arg1, { println ‘Hello World’ })
6.如果最后一个参数是closure,它可以从小括号从拿出来: myMethod(arg1) { println‘Hello World’ }

  1. Android中使用
buildscript { //  等同 def buildscript(Closure closure),?? buildscript直接使用,那是在什么地方定义的?
    repositories {
        jcenter()
    }
    dependencies {
        classpath ‘com.android.tools.build:gradle:1.2.3‘
    }
}

方法都是在Project中定义的,构建脚本顶层的语句块都会被委托给Project的实例,eg:  在Project中buildcript的定义:

  /**
     * <p>Configures the build script classpath for this project.
     *
     * <p>The given closure is executed against this project‘s {@link ScriptHandler}. The {@link ScriptHandler} is
     * passed to the closure as the closure‘s delegate.
     *
     * @param configureClosure the closure to use to configure the build script classpath.
     */
    void buildscript(Closure configureClosure);

上面可以看到repositories在ScriptHandler中执行,在ScriptHandler中又委托到RepositoryHandler。

3: task 有两个生命周期,配置阶段和执行阶段,gradle在执行task时,都会先对task进行配置,task中最顶层的代码就是配置代码,在配置阶段执行,其他代码实在执行阶段执行的。eg:

task Task1{println “hello” // 这段代码是在gradle配置阶段执行的}

task Task2{
def name =“hello”// 这段代码是在gradle配置阶段执行的doLast{println name // 这段代码是在gradle执行阶段执行的}
}

task Task3 << {// << 语法糖,相当于doLast,因此整个代码都是在执行阶段执行的println name // 这段代码是在gradle执行阶段执行的}

4:task执行顺序
dependsOn: TaskB 依赖TaskA, TaskB.dependsOn TaskA 这样每次执行B都会先执行A,下面是相同的写法

task A << {println ‘Hello from A‘}
task B {    dependsOn A
    doLast {        println ‘Hello from B‘  
    }
}

同理也可以改变已有的依赖顺序,直接改变dependsOn,也可以同时依赖多个任务。

mustRunAfter: 有A B C三个task, C依赖于A,B,但A,B不相互依赖,如果要保证每次执行时A都在B之前执行,可以写作

task A << {println ‘A‘}
task B << {println ‘B‘}
task C << {println ‘C‘}

C.dependsOn A
C.dependsOn B
B.mustRunAfter A

finalizedBy:现在有两个task,unit和ui,假定这两个task都会输出测试报告,把这两个测试报告合并成一个:

task unit << {println ‘Hello from unit tests‘}
task ui << {println ‘Hello from UI tests‘}
task tests << {println ‘Hello from all tests!‘}
task mergeReports << {println ‘Merging test reports‘}

tests.dependsOn unit
tests.dependsOn ui
ui.mustRunAfter unit
mergeReports.dependsOn tests // 执行这个就可以合并了。// 下面这种方式等价于上面这种tests.dependsOn unit
tests.dependsOn ui
ui.mustRunAfter unit
mergeReports.dependsOn tests

tests.finalizedBy mergeReports// 执行tests就能合并了。表示tests执行完成后,在执行mergeReports

网易云免费体验馆,0成本体验20+款云产品!

更多网易研发、产品、运营经验分享请访问网易云社区

相关文章:
【推荐】 HBase - 数据写入流程解析
【推荐】 洞察数据中隐藏的故事——网易有数的“正确”使用方式
【推荐】 从golang的垃圾回收说起(下篇)

原文地址:https://www.cnblogs.com/163yun/p/9698944.html

时间: 2024-10-21 07:24:02

Gradle task的相关文章

flutter 卡在Running Gradle task &#39;assembleDebug&#39;...

Android项目运行时出错 卡在Initializing gradle… 运行时会卡在Initializing gradle..., 此时因为Android项目会用到Gradle, 如果没有FQ,下载速度会非常慢, 此时我们可以在项目中的android/gradle/wrapper/gradle-wrapper.properties中查看gradle版本号以及地址, 我们可以手动下载然后解压到~/.gradle/wrapper/dists/中. 卡在Running ‘gradle assemb

flutter 之Waiting for another flutter command to release the startup lock...和Running Gradle task &#39;assembleDebug&#39;... 卡住

看了网上很多解决办法,一般是找到fluttersdk的bin的cache目录下的lockfile然后删掉 然鹅...正常情况下一般不会让你删,一般显示有进程占用... 于是换了种思维,发现在win下每次运行flutter,git-remote都要发送次请求,目的的是GitHub 处于天朝,我是移动网络,所以上GitHub速度非常慢,而每次这个git-remote都要接受1.33m才会进行下一个动作 如果不断开,快的时候10几秒搞定,慢的时候直接卡死, 如果ctrl+c结束再运行也是没用 尝试去直

利用Gradle Task自动创建项目结构

将下面代码加入到build.gradle中: apply plugin: 'java' task "create-dirs" << { sourceSets*.java.srcDirs*.each {it.mkdirs()} sourceSets*.resources.srcDirs*.each {it.mkdirs()} } 用gradle运行此任务: $ gradle create-dirs 生成的目录结构: . ├── build.gradle └── src ├──

Gradle Task入门演示二

https://docs.gradle.org/current/userguide/more_about_tasks.html Defining tasks 有多种方式可以定义task,现在再来看下面这几种方式, task(helloTask) << {     println "hello" } task的名字helloTask,还可以使用引号, task('helloTask2') << {     println "hello" } 还

自定义Gradle Task实现一键批量部署Springboot应用

在未使用Jenkins自动化部署工具之前,我们部署使用gradle构建的单个springboot应用的流程大致如下: 1.在idea使用gradle build命令编译打包jar包: 2.打开jar包存放的windows目录窗口: 3.打开访问服务端机器的SSH工具软件并前进到部署目录: 4.上传第2步jar包到第3步目录 5.停止当前应用进程: 6.备份当前应用jar包: 7.修改将要部署的jar包名称为当前环境指定的文件名: 8.启动应用 上面部署方式对于只有1.2个环境的应用来说还可以接受

Gradle task 及生命周期

task("opendoor",{ var animal = "elephant"//扫描时执行 doFirst{//运行时执行 } }) task("putelephant",{ }).dependsOn("opendoor") task("closedoor",{ }).dependsOn("putelephant") 原文地址:https://www.cnblogs.com/sup

Gradle Goodness: Rename Ant Task Names When Importing Ant Build File

Migrating from Ant to Gradle is very easy with the importBuild method from AntBuilder. We only have to add this single line and reference our existing Ant build XML file and all Ant tasks can now be executed as Gradle tasks. We can automatically rena

从零开始学习Gradle之二---如何使用Task

上一篇文章中,我们提到了Gradle的一些基本概念,如Project.Task以及Action,并且创建了我们的第一个Task.这次我们来看看Gradle中关于Project和Task的更多细节. 1. Project和Task 对于build.gradle配置文件,当运行Gradle <Task> 时,Gradle会为我们创建一个Project的对象,来映射build.gradle中的内容.其中呢,对于不属于任何Task范畴的代码,Gradle会创建一个Script类的对象,来执行这些代码:

【转】从零开始学习Gradle之二---如何使用Task

原文:http://www.blogjava.net/wldandan/archive/2012/07/05/382246.html 上一篇文章中,我们提到了Gradle的一些基本概念,如Project.Task以及Action,并且创建了我们的第一个Task.这次我们来看看Gradle中关于Project和Task的更多细节. 1. Project和Task 对于build.gradle配置文件,当运行Gradle <Task> 时,Gradle会为我们创建一个Project的对象,来映射b