写在前面
距离上次更博已经整整两年了,坚持写blog的flag啪啪打脸😷
现在也已入职两年了,和当初在象牙塔中对工作的幻想相比,有出入,也有惊喜。对于我个人成长的预期,无论是技术还是业务理解还是为人处世,好像学了很多,又好像什么都没有留下。最近惰性有点大,准备抽空开始恢复blog,我的总结记录能力真的很差,写一篇博客真的很痛苦,但我想这样才会更好的将知识留到脑子里把。希望可以坚持下去!至少…每周一篇把!哈哈哈哈哈哈哈!最近在做插件化相关工作,涉及了一些gradle、transform的知识,记录下学习笔记❤️
初识gradle
- 什么是gradle?
Gradle 是一种开源自动化构建工具,支持多语言环境,受 Ant、Maven 思想的影响,集二者之大成,相比 Ant 的不规范,Maven 的配置复杂、生命周期限制严重,Gradle 既规范也更灵活,可以使用DSL (领域特定语言,如Groovy 或 Kotlin)编写构建脚本,脚本更短小精悍~
它的特性有:
- 高度定制化:模块化可扩展,更灵活
- 构建迅速:支持并行构建,自动复用之前任务构建的结果以提高效率
- 功能强大:支持多语言环境,包含 Java、Android、C++、Groovy、Javascript 等项目的构建
-
gradle中的 project & task
projects 和 tasks是 Gradle 中最重要的两个概念。任何一个 Gradle 构建都是由一个project或多个 projects 组成。每个 project 或许是一个 jar 包或者一个 web 应用,它也可以是一个由许多其他项目中产生的 jar 构成的 zip 压缩包。
每个 project 都由多个 tasks 组成。每个 task 都代表了构建执行过程中的一个原子性操作。如编译,打包,生成 javadoc,发布到某个仓库等操作。
简单来说,project相当于一个构建工程的一个模块,而 task 是其中一个模块的一个操作
构建gradle项目
Gradle 默认会从src/main/java 搜寻打包源码,在 src/test/java下搜寻测试源码。并且 src/main/resources下的所有文件按都会被打包,所有src/test/resources下的文件 都会被添加到类路径用以执行测试。所有文件都输出到build下,打包的文件输出到build/libs下。
常见任务
clean
删除 build 目录以及所有构建完成的文件。
assemble
编译并打包 jar 文件,但不会执行单元测试。一些其他插件可能会增强这个任务的功能。例如,如果采用了 War 插件,这个任务便会为你的项目打出 War 包。
check
编译并测试代码。一些其他插件也可能会增强这个任务的功能。例如,如果采用了 Code-quality 插件,这个任务会额外执行 Checkstyle。
gradle依赖管理
声明依赖
build.gradle
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
testCompile group: 'junit', name: 'junit', version: '4.+'
}
compile
编译范围依赖在所有的 classpath 中可用,同时它们也会被打包
runtime
runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如,你可能在编译的时候只需要 JDBC API JAR,而只有在运行的时候才需要 JDBC 驱动实现
testCompile
测试期编译需要的附加依赖
testRuntime
测试运行期需要
定义格式:’group+name+version’
eg:
dependencies {
compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
}
dependencies {
compile 'org.hibernate:hibernate-core:3.6.7.Final'
}
gradle执行顺序
我们知道构建一个Android项目,Android Studio 会为我们三个.gradle文件,分别是:位于root下的
build.gradle,settings.gradle和位于app下的build.gradle。 他们的职责和执行顺序分别是啥呢?
先说结论,嘻嘻
1.执行项目目录下面的settings.gradle
2.执行项目目录下面的build.gradle
3.根据setting.gradle中的配置顺序逆序执行module的build.gradle(即后写的先执行)
【Settings.gradle】
Setting文件可以说是子项目(也可以说是Module)的配置文件,大多数setting.gradle的作用是为了配置子工程,再Gradle多工程是通过工程树表示的。
例如: 在Android studio中指定相应的module能在主工程当中使用:
include ':app'
include ':plugin-app'
include ':plugin-manager'
include ':constants'
rootProject.name = 'eden'
//includeBuild 'sdk/coding'
//includeBuild 'sdk/core'
//includeBuild 'sdk/dynamic'
includeBuild 'eden-sdk/coding'
includeBuild 'eden-sdk/core'
Project下【build.gradle】
Project层级的build.gradle描述的是作用于所有Module的配置,包括gradle版本等。
buildscript {
repositories {
// 代码托管库,可以从https://jcenter.bintray.com/下载对应的代码库
jcenter()
//同理于jcenter(),申明代码托管库Google,如果需要相应的代码库,那么就会去下载
google()
//有时你可能还会使用maven的代码托管库
//maven{ url 'https://jitpack.io'}
}
//这里面依赖的插件应用于整个project,不同于module下面的build.gradle只应用于当前的module
dependencies {
//声明了一个Gradle插件用来作为Android开发。3.2.1为gradle版本号
classpath 'com.android.tools.build:gradle:3.2.1'
// classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
}
}
allprojects {
repositories {
jcenter()
google()
}
}
Module下【build.gradle】
Module层级的build.gradle。每个Module下都有一个作用于该Module的build.gradle文件,描述了该Module相关的配置。这些配置主要包括:BuildTypes,ProductFlavors,Dependency,SigningSettings等。
高频考点 参考这里~~
groovy语法初识
这个下章见吧@_@
gradle调试方式
-
``` shell function enable_gradle_script_debug() { if [[ "$*" == "1" ]]; then export GRADLE_OPTS="-Dorg.gradle.debug=true -Dorg.gradle.daemon=false" echo "gradle script debug enabled." else export GRADLE_OPTS="" echo "gradle script debug disabled." fi } - 在项目中创建一个remote任务