Gradle 总结

Gradle环境

下载方式
通过官网 Gradle Distributions 可以直接下载对应版本的Gradle,包括all/bin/src,分别对应全部内容/可执行文件/源码。

通常团队中或集体项目中使用以wrapper的方式配置,如果直接以bin配置,bin文件夹中压缩包都至少有上百MB,存储传输都不方便。wapper只包含一个jar以及对应的配置文件,使用时通过执行gradlew下载配置对应版本的gradle就很方便。

首先下载gradle的bin文件,通过调用 .gradle wrapper 即可生成wrapper文件,配置到项目中传播使用即可。

GradleUserHome

当前环境中可配置多个UserHome,但没必要,使用同一个可以共用缓存依赖节省时间。

gradlew构建任务顺序

  1. 判断本地是否安装gradlew对应版本的gradle,如果没有下载安装。
  2. 查找对应版本的Daemon,如果没有先启动Daemon,后台Daemon无任务最多存活5小时。整体是C/S模式,主要任务在后台Daemon中完成,前后台通过Socket方式通信。有后台运行的Daemon时,Gradle任务启动速度很快。

例如首次启动,会提示“Starting a Gradle Daemon..”表明启动Daemon虚拟机。之后再次启动仅创建Client Gradle,速度会快很多。以下图为例,首次启动3s,再次启动仅1s。

一般后台Gradle存活时间是5小时,没必要手动停止。如果要停止的话可以通过./gradlew --stop命令。

Groovy语言

The Apache Groovy programming language - Documentation

强引用 + 动态调用

可以在AndroidStudio的Tools/Groovy Console中开启编辑Groovy的窗口。

目前在用到的Groovy的语法中,个人感觉最重要的是闭包的感念,在kotlin的使用过程中,闭包已经非常熟悉。

  • Groovy DSL中不引起歧义的话方法可以不写();
  • 闭包如果是最后一个参数,调用时可以放在()的后面;

Gradle构建过程Build Lifecycle

Initialization

Gradle支持单项目构建和多项目构建。在初始化阶段,Gradle会决定将哪些工程添加到构建中,并且为参与构建的工程创建一个Project的实例对象。

Configuration

配置所有参与构建的工程,执行工程中配置的build.gradle脚本的内容。执行过程中build.gradle是自上而下的顺序执行。

创建任务

Task task(String task, Closure closure);

其中的闭包closure参数在configure阶段会执行以配置task。

doLast

Task doLast(Closure closure)

将closure函数添加到当前任务的末尾。当执行完任务后执行此closure。

Execution

根据命令行中的参数确认任务名称并继续执行。

Gradle模型

Project

build.gradle可以理解为一个Project对象,其中所有的无主方法都是Project的成员函数。

// 在Project配置完成后回调
void afterEvaluate(Closure closure)
// 在Project配置前回调
void beforeEvaluate(Closure closure)

// 多项目构建中所有项目执行的操作
void allprojects(Closure closure);

// configuration 阶段依赖的类路径的配置
void buildscript(Closure closure);

// 获取文件句柄
File file(Object f);

// 多项目构建中通过project名称获取project对象
Project findProject(String projectName);

// 当前build.gradle所在工程的build文件夹路径,可能还未创建但构建的输出一定是在这个目录下
File getBuildDir();



Task

// 任务执行末尾添加闭包内操作
Task doLast(Closure closure);

// 任务执行依赖的任务obj 可以为task的name
Task dependsOn(Object... obj);

Gradle插件编写

插件复用

通过实现Plugin接口,封装插件方法。

class MyPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        // 注意是task是Project的成员函数。直接写task('mt')表示是MyPlugin方法会报错
        project.task('mt') {
            println 'this is MyPlugin Task'
        }
    }
}

通过apply函数引用: apply(new HashMap('plugin': MyPlugin))  加糖简写为: apply plugin: MyPlugin

apply plugin: MyPlugin

除此之外,还可以apply plugin: ‘https://www.xxx.xx’ 路径方式引入云端资源。

二进制Binary插件

在Gradle的configuration阶段会应用插件的配置,所以需要在buildScript的dependencies中添加仓库的地址。例如引用apatch的commons库。

import org.apache.commons.lang3.StringUtils
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath group: 'org.apache.commons', name: 'commons-lang3', version: '3.9'
    }
}
if (StringUtils.isBlank('')) {
    println 'is Empty'
}

如果自己定义gradle二进制插件步骤:

  1. 实现Plugin接口,重写apply方法
  2. 在META-INF/gradle-plugins下配置{cc.cc}.properties文件,{cc.cc}即为插件ID
  3. 在上步的properties文件中,implementation-class={Plugin接口实现类}即插件入口类

使用步骤:

  1. 在buildScript的classpath添加二进制仓库地址
  2. apply plugin: 插件ID

buildScript插件

与二进制类似,约定俗成的将buildSrc的类路径添加到了buildScript的classpath中,无需特殊添加。

所谓自定义Plugin即实现Plugin接口,重写apply接口。

public class MyPlugin implements Plugin<Project> {
    @Override
    public void apply(Project project) {
        project.task("MyTask", task -> {

        });
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值