本文来自网易云社区

作者:孙有军

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 worldclass 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 AdoLast {        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+款云产品!

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

相关文章:
【推荐】 即将到来的5G,我们该做些什么准备?

Gradle task相关推荐

  1. 【错误记录】Flutter 应用运行卡在 Running Gradle task ‘assembleDebug‘... ( 配置阿里云 Maven 仓库镜像 )

    文章目录 一. 报错信息 二. 解决方案 1. 解决方案 1 2. 解决方案 2 一. 报错信息 运行 Flutter 应用 , 会一直卡在 Running Gradle task 'assemble ...

  2. Android studio gradle task list 不显示问题

    问题描述 新电脑安装android studio后,导入工程,各种配置都弄好变更好,出现了如下情况: 之前习惯的gradle task 不在列表中,好不习惯. 正常期望如下: 处理方法 快捷键Ctrl ...

  3. Gradle Task的使用

    文/咖枯(简书作者) 原文链接:http://www.jianshu.com/p/cd1a78dc8346 前言 我们的项目打包APK前需要根据业务需要更改AndroidManifest文件内容和替换 ...

  4. Android 跟踪 Gradle Task 执行

    https://blog.csdn.net/sk719887916/article/details/84191771 作者:Tamic Gradle 大家并不陌生,但我相信你会使用它配置一些依赖,编写 ...

  5. Android Gradle Task详解

    创建一个task 创建一个task很简单,直接使用task关键字来创建,最常见的形式是使用task + 名字 + Closure代码块.示例如下. task ms1 {println("== ...

  6. flutter打包解决 Running Gradle task ‘assembleRelease‘...死循环问题

    其实说到底就是国内访问google源太慢或者超时,所以两个方案 方案一:让自己能顺利访问google 懂得都懂 方案二:更换镜像地址,一共需要更换一下3个地方 1-更改 flutter/package ...

  7. Android Gradle 自定义Task 详解

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/76408024 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  8. android自定义task,Android Gradle 自定义Task 详解

    一:Gradle 是什么 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具. 它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于X ...

  9. 【Android 修炼手册】Gradle 篇 -- Android Gradle Plugin 主要 Task 分析

    上文回顾 上篇文章里讲了 android gradle plugin 的整体流程,引入插件以后生成了很多 Task,这篇文章就谈谈生成的这些 Task 都有什么用处,以及一些主要 Task 的实现 预 ...

最新文章

  1. Spring Boot 工程集成全局唯一ID生成器 Vesta
  2. android 快速启动,《Android APP可以有的东西》之显示篇:快速启动App
  3. 安装APK失败,错误代码:INSTALL_FAILED_INVALID_APK 解决方案
  4. Codeforces 766E
  5. mySql配置在nodejs中使用
  6. 科技前沿智能创新 2019北京智能家居 全屋智能博览会
  7. snmp服务 2003 镜像_美国掌握全球70%根服务器,一旦对中国关闭,我们将无法上网?...
  8. 按钮点击没有反应_时控开关按键没反应怎么办?
  9. 生活在别处——“Samsung Cloud Print”云打印体验
  10. MapReduce高级编程2
  11. SWF反编译软件Action Script Viewer ASV2011/08发布(AS3反编译引擎最重大升级)
  12. Python字符串等于
  13. China Pub 高清书籍6CD 包含的图书目录
  14. 苹果手机输入屏保后锁屏_苹果手机动态锁屏屏保怎么设置
  15. ps4手柄 android,ps4手柄配对手机,PS4手柄怎么连接安卓手机,求
  16. 嵌入式linux设置屏幕亮度
  17. 百度NLP架构与应用
  18. 为什么证券投资是世界上最难成功的行业
  19. python导入数据画直方图加正态曲线_用python制作正态分布图
  20. 为什么编程是独一无二的职业

热门文章

  1. 未能加载文件或程序集或它的某一个依赖项_手写一个miniwebpack
  2. python最小二乘法拟合_Python 普通最小二乘法(OLS)进行多项式拟合
  3. vs最好的版本_Win10 环境下,LightGBM GPU 版本的安装
  4. npm run build 打包 之后怎么用_npm 组件你应该知道的事
  5. 定价是什么意思_茶商给茶叶定价也有潜规则!从定价就能看出,买的不如卖的精...
  6. 主板和机箱的螺丝_铝镁合金外壳,双侧透设计,乔思伯TR03-A机箱 装机体验
  7. java多线程写在哪一层_面试知识点三:Java多线程
  8. java map null吗_Java: Map里面的键和值可以为空吗?
  9. garch预测 python_安利几个非常实用的 Python 库
  10. php au著h权限管理,Jirafeau:一个简洁的临时文件分享系统,可随时删除