不会groovy?那你可以通过kotlin来学习gradle

1,203 阅读6分钟

kotlin 遇上 gradle

做android开发的朋友对于gradle应该是再熟悉不过了,大多数朋友应该都是能大致看懂这些gradle脚本表示什么意思,以及更改一些构建配置,但是遇到一些大型项目的时候为了统一管理整个项目的构建(比如组件化、插件化),通常我们需要自己定制一些构建脚本,这个时候如果我们不懂groovy语言的一些语法以及api的话,那我们自己编写构建脚本以及调试还是挺有难度的。android对于kotlin的支持已经有一段时间了,相应也有很多朋友也都了解过使用过这门语言来进行开发,恰好Gradle团队正在尝试使用Kotlin语言作为Gradle脚本的官方开发语言,大家可以看看这篇文章kotlin meets gradle,里面说Kotlin脚本支持将在Gradle 3.0中提供,所以如果想使用kotlin来编写gradle脚本,请使用3.0以上的版本。

gradle深入

kotlin的一些语法我就不再赘述了,如果不太了解的朋友可以看一下kotlin语言中文网的文档,官方文档是最权威(个人推荐)。那我们就直接进入正题。

gradle介绍

我们在开发一个andorid应用的时候,会编写一些java、kotlin、xml,也会放一些res资源文件,有时候也会使用一些第三方的框架,让后我们把这些事情做好了之后,直接点击运行就可以在手机上面看到我们写的结果了。我们写的都是源文件,要先把源文件编译成class文件,然后再把这些class文件与资源文件等其他文件打包成apk,在后再装到手机上。粗略的分析了一下过程,如果要细分还是有很多个步骤的。当我们点击了运行,gradle就帮我们完成了这样一系列的操作。所以gradle可以看成是一个“打包工具”,将我们一些提供的输入文件“java、xml、png等”帮我们打包我们需要的产品“apk”。

gradle基本组件

Gradle 是一个框架,它定义一套自己的游戏规则。我们要玩转Gradle,必须要遵守它设计的规则。下面我们来讲讲Gradle 的基本组件:

Gradle 中,每一个待编译的工程都叫一个Project。每一个Project 在构建的时候都包含一系列的Task。比如一个Android APK 的编译可能含:Java 源码编译Task、资源编译Task、JNI 编译Task、lint 检查Task、打包生成APK 的Task、签名Task 等。

一个Project 到底包含多少个Task,其实是由编译脚本指定的插件决定。插件是什么呢?

插件就是用来定义Task,并具体执行这些Task 的东西。刚才说了,Gradle 是一个框架,作为框架,它负责定义流程和规则。而具体的编译工作则是通过插件的方式来完成的。比如编译Java 有Java 插件,编译Groovy 有Groovy 插件,编译Android APP 有Android APP 插件,编Android Library 有Android Library 插件

好了。到现在为止,你知道Gradle 中每一个待编译的工程都是一个Project,一个具体的编译过程是由一个一个的Task 来定义和执行的。

gradle Task

我们新建一个gradledemo的文件夹,然后打开命令行执行gradle init命令(需要配置环境变量),执行结果如下

好像跟我们android工程差不多,我们用as打开这个项目。既然我们知道一个具体的编译过程是由一个一个的Task 来定义和执行的,那我们先来定义个简单的task。当然groovy的脚本我们不会写,那我们写kotlin。首先要把.gradle文件加上.kts后缀,setttings.gradle.kts里面就有报错了,我们需要把'gradledemo'改成双引号(kotlin单引号表示字符)。那我们现在build.gradle.kts里面加上这么一个task

task("copy", Copy::class) {
    description = "Copies sources to the dest directory"
    group = "Custom"

    from("src")
    into("dest")
}

这一段代码就是kotlin dsl风格的api,创建了一个名为copy的任务。我们点击task函数,可以看到几个重载的方法,当然我们也可以这么写

task<Copy>("copy") {
    description = "Copies sources to the dest directory"
    group = "Custom"

    from("src")
    into("dest")
}

你写的途中就会发现编译器的提示,这样我们写起来就轻松许多,而且我们可以点进去看注释源码,这样也可以提高我们不少学习效率。通过注释我们可以知道task的意思:通过给定的name和type来创建task,并通过给定的configuration(后面的函数)来配置这个task,然后把它加入到这个project的tasks container。嗯,这样看起来大家估计就会明白很多。我们继续看一下我们对task的配置(也就是函数里面的内容,这个函数是带有接受者的,这个接受者的类型是Copy),所以我们可以使用Copy里面一些自带的api(Copy是Gradle附带的一个可以在您自己的项目中配置的任务库中的一种,它将文件从一个位置复制到另一个位置)。

  • description:设置task的描述
  • group:设置task的所属群组
  • from:复制的源路径
  • into:复制的地址路径

我们在gradledemo下新建文件夹src,里面在放一个demo.kts,我们执行之下我们的task(gradle copy),刷新一下,就可以看到创建了一个dest文件夹,里面的内容跟sec一样。看一下gradle面板,刷新一下可以看到我们刚刚定义的task。

gradle插件

创建一个文件夹javademo,然后运行命令(gradle init --type java-application),gradle就会为我们创建基本的java项目结构,用as打开

可以看到就这样一个插件就包含了那么多的task。拥有这些插件,我们就能能够轻松的完成我们项目的构建任务。

gradle参考资料

Gradle脚本是配置脚本。在脚本执行时,它配置特定类型的对象。例如,在构建脚本执行时,它会配置类型的对象Project。此对象称为 脚本的委托对象。下表显示了每种Gradle脚本的委托。

关于gradle一些api可以参考Gradle构建语言参考

要熟练的编写构建脚本,需要对gradle的api比较熟悉,这是一个循循渐进的过程,但是我们使用kotlin来学习编写,肯定能够让我们对gradle的学习事半功倍。