Gradle配置文件拆解

Gradle配置文件拆解

gradle配置文件里的内容其实“方法调用”,长得类似与json,其实是groovy中的“闭包”(Closure)知识:把方法当作形参传递进去

java中无法把方法当形参传递,有类似的监听(把方法放进一个类中,用匿名内部类的形式把类的对象传进去)(里面的回调就是延后执行的)【=>闭包内容不一定马上执行】

java8之后有了lambda表达式,可以简化写法,实际传的还是匿名内部类的对象

闭包是最后一个参数,可以挪到()

buildscriptrepositories控制dependencies的来源,dependencies控制插件的来源

classpath在具体实现类中DefaultDependencyHandler.groovy也找不到,但这个groovy中有定义methodMissing方法

Gradle是什么

  • 是构建工具,不是语言
  • 它用了Groovy这个语言,创造了一种DSL,但它本身不是语言

怎么构建

  • 按照gradle的规则(build.gradlesettings.gradlegradle-wrappergradle语法)

闭包

  • 相当于可以被传递的代码块

compileimplementationapi

  • implementation:不会传递依赖

  • compile / api:会传递依赖;apicompile的替代品,效果完全等同

  • 当依赖被传递时,二级依赖的改动会导致0级项目重新编译;当依赖不传递时,二级依赖的改动不会导致0级项目重新编译

Gradle项目结构,以及Task

项目结构

  • projectbuild.gradle

  • project:由settings.gradle配置多个

    查找 settings 的顺序:

    1. 当前目录
    2. 兄弟目录 master
    3. 父目录

Task

  • 使用方法:./gradlew taskName

  • task 的结构:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    task taskName{
    初始化代码
    doFirst{
    task 代码
    }
    doLast {
    task 代码
    }
    }
  • doFirst()doLast()和普通代码段的区别:

    • 普通代码段:在task创建过程中就会被执行,发生在configuration阶段
    • doFirst()doLast():在task执行过程中被执行,发生在execution阶段。如果用户没有直接或间接执行task,那么它的doLast()doFirst()代码不会被执行
    • doFirst()doLast()都是task代码,其中doFirst()是往队列的前面插入代码,doLast()是往队列的后面插入代码
  • task的依赖:可以使用 task taskA(dependsOn: b) 的形式来指定依赖。指定依赖后,task会在自己执行前先执行自己依赖的task

Gradle执行的生命周期

三个阶段:

  • 初始化阶段:执⾏ settings.gradle,确定主 project 和⼦ project
  • 定义阶段:执⾏每个 project 的 bulid.gradle,确定出所有 task 所组成的有向⽆环图
  • 执⾏阶段:按照上⼀阶段所确定出的有向⽆环图来执⾏指定的 task

在阶段之间插⼊代码:

  • ⼀⼆阶段之间:

    settings.gradle 的最后

  • ⼆三阶段之间:

1
2
3
afterEvaluate {
插⼊代码
}