Gradle入门
文章目录
前言
在前一篇文章我们讲了 Groovy ,有了 Groovy 的基础就能看懂 Gradle 里的语法。但是光有 Groovy 基础还是不够的, Gradle 提供了一些 API 让我们可以很方便的参与到项目的构建中。
目录结构
在一个普通的 gradle 项目中通常会包含如下结构
|
|
gradlew
gradlew 其实就是一个脚本文件,用来执行相应的 task(后面会介绍) 。
gradlew 是在 Linux 和 macOS 下使用的,而 gradlew.bat 则是 Windows 下的批处理文件,在 Windows 下使用。
gradlew 是和特定的版本关联在一起的,当我们有多个版本的 gralde 的时候,这样可以保证我们的项目不会因为版本的问题导致编译不了。如果关联的版本不存在, gralde 会先下载。
wrapper
gradle-wrapper.jar
gradle-wrapper.jar 是一个用来执行下载特定版本 gralde 的 jar 包
gradle-wrapper.properties
gradle-wrapper.properties 文件中存放了特定版本的 Gradle 的下载路径,以及本地下载好的路径。
|
|
生命周期
在 Gradle 中会在不同阶段做不同事情,也就是 Gradle 有自己的生命周期,分为初始化、配置、执行。
初始化阶段
对于 Android 来说,初始化阶段就是加载 settings.gralde 看看引入了哪些项目,对于引入的项目都会为其创建一个 Project 对象。
配置阶段
在配置阶段会执行每个项目下的 build.gradle 文件,根据项目的依赖生成拓补图。
执行阶段
在执行阶段会执行特定的 Task ,在这个阶段是真正干活的,会执行 Task 具体的逻辑。
生命周期的监听
在 gralde 执行的过程中,我们可以通过对其生命周期进行监听,方便我们在特定的时期做一些逻辑处理。
执行 gralde 任务会自动执行初始化和配置。在这个过程中我们可以对生命周期进行监听。
|
|
Project
前面提到在 settings.gralde 中使用 include 关键字引入的项目都会创建一个 project 。 gralde 为我们提供了许多 API 来操作 project 。
获取所有 Project
|
|
输出如下所示
|
|
可以看到当前工程下有三个 Project 。其实在项目的 build.gralde 也有对所有项目进行配置的相关代码,来看一下
|
|
在这里为所有的项目都配置了仓库,这样我们依赖第三方的项目才知道要到哪里去下载。
这里可以直接使用 allprojects 是因为 groovy 会为默认为字段加上 getter/setter 。
获取子 Project
|
|
输出结果如下
|
|
可以看到比之前少了 Gradle 的 Project ,这是因为 Gradle 是 Root Project 。
获取父 Project
|
|
输出结果如下
|
|
可以看到 app 和 groovy 的 parent 都是 Gradle 。如果当前项目时根项目的话会返回 null 。
获取 Root Project
|
|
输出结果如下
|
|
获取指定的 Project
|
|
输出结果如下
|
|
通过指定 project 的名字我们就可以获取指定的 Project 。
扩展属性
在 Project 中为我们定义了有些属性,但是这些属性太少了,我们不够用,所以 Gradle 考虑到这个问题了,为我们提供了 ext 字段,让我们可以去扩充需要的属性。我们以 compileSdkVersion 为例演示一下怎么使用。
我们在项目下新建一个 config.gralde 文件,内容如下
|
|
然后我们就可以在别的模块中使用了,比如在 app 模块的 build.config 中可以这么用
|
|
这样如果我们有很多模块,就可以统一配置为一个,避免了硬编码。这样不会因为要升级 sdk 的版本,把所有的模块都改一遍。
除了可以在 gralde 文件中设置,还可以在 gralde.properties 中设置,不过在 gralde.properties 中设置的类型需要强制转换成需要的类型。
|
|
在使用的时候可以通过 hasProperty('compileSdkVersion') 来判断是否有这个属性,有的话可以通过 compileSdkVersion.toInteger 来把类型装换为需要的类型。
文件操作
|
|
输出结果如下
|
|
拷贝文件
|
|
通过 copy 闭包实现拷贝文件非常方便
Task
在之前我们介绍了 Gradle 生命周期,提到了 Task 会在执行阶段运行,现在就来看看。
定义 Task
|
|
在 Task 中,除了在 doLast 和 doFirst 中的代码,其余的代码都是在配置阶段执行的。
除了上面这种方式用来定义 Task ,下面这几种也是可以的
|
|
Task 依赖
Gradle 中有非常多 Task ,有些需要在某一个 Task 执行之后再执行特定的 Task ,这样就会形成一个依赖,我们可以通过手动来指定这些依赖。
|
|
执行顺序
除了上面依赖的方式可以决定 Task 的调用顺序,还可以通过 mustRunAfter 来设置调用的顺序
|
|
总结
今天我们了解了 Gradle 的目录结构、生命周期、 Project 还有创建 Task ,有了这些基础后,就不会再认为 Gradle 只是个配置文件了。
我们可以根据自己的需要去改进项目的构建。