1、gradle组成
和大多数库一样,gradle是由一个bin脚本和一堆jar包构成,就是启动脚本在JVM加载一堆的运行库
2、一般会通过wrapper的方式下载gradle的distribution
gradle的发布非常快,怎样让你的构建在不同的版本中保持稳定?使用gradle wrapper
wrapper的本质是在你的目录下安装一个很小的jar包和一个脚本
gradle-wrapper.jar
gradle-wrapper.properties
在你构建的项目下运行命令“gradle wrapper”,会创建出gradlew命令以及上面的jar包和脚本
相当于将你的项目与具体的gradle版本绑定,别人运行你的项目使用gradlew开头的所有命令,
会自动下载相匹配的gradle版本


总之一句话,如果你的电脑上没有安装Gradle,你需要去下载一个别的项目,
把gradle目录和gardle.bat和gradle.cw拷贝过来,运行./gradlew命令,就会根据
gradle-wrapper.properties配置的url去下载gradle到你的GREADLE_USER_HOME中
3、GradleUserHome作用?
gradle构建过程中只跟两个目录打交道:你的项目目录和GradleUserHome
GradleUserHome默认在你家目录下的.gradle目录中,可以在环境变量中配置,其中:
init.d 是对所有构建生效,放全局的一些脚本,例如代理阿里云
wrapper放的是gradlew命令下载的一些gradle版本
caches放缓存
4、daemon的作用?
jvm启动加载jar包很慢,gradle3之后默认使用daemon模式
当你使用一个gradle xx命令时,只启动一个jvm client
发送请求给后台的jvm进程daemon,这样可加快构建速度
如果daemon和client不兼容,client会自动重开一个daemon
你可以使用--no-daemon不使用daemon
5、gradle构建的三个阶段
gradle的构建过程包括三个阶段:
1)初始化阶段
读取项目信息,构建的是单项目还是多项目工程,决定哪些项目要参与此次构建,为每个项目创建Project实例
Project类是GradleAPI的核心
2)配置阶段
对上一个阶段创建的Project实例进行一些设定
配置阶段的本质就是把build.gradle当成groovy代码从上到下执行一遍
3)执行阶段
我们试试创建一个简单的helloworld任务:

还可以改成这种写法:

可以看到,在配置阶段就会打印“configure helloworld task”

现在, 我们执行一下helloworld任务:

6、Gradle的核心模型(Project.java、Task.java、Lifecycle与Hook)
Project本质是一个项目在JVM中的实例,为什么Project很重要? 因为一切无主的方法,找不到来源的方法都从Project上面去查找
比如上面我们使用的task方法,实际是Project类中的一个方法

如果你的项目是多模块的话,gradle会生成树状的project,你可以在这个树上查找其他project,比如

Project.java类中有很多比较重要的方法,例如:
钩子函数:



多项目查找:

很重要的方法:

Task.java:
任务是gradle构建中最小的单元。这里可以看到我们创建的helloworld任务

有意思的是,Task可以在运行时创建,并不是写死的,例如:

Task类中的其他常用方法:
1、dependsOn

偶数任务依赖了first任务

还可以这样写:

或者这样写:

2.doFirst、doLast

作用是把闭包添加到执行列表中,只有在运行任务时才执行闭包
LifeCycle:生命周期钩子函数:

project的build.gradle执行完成之后,会执行afterEvaluate的闭包函数
7、插件编写(构建逻辑的复用、简单插件、script插件、发布的插件)
插件的本质就是一堆可复用的构建逻辑
比如,你有一个奇怪的需求,要在每个project里面创建10个任务,这时候,需要把逻辑抽出来复用。
1)第一种插件抽取方式:直接写在build.gradle中

2)你可以将MyAwesomePlugin单独写到其他地方,然后这样远程去引用:

8、buildSrc插件
我们知道,如果想在java代码中使用jar包,需要在dependencies中引入依赖:

然后去使用:

如果想在build.gradle代码中使用String.utils的jar包,怎么做

这就涉及到classpath了。
如果想在build.gradle代码中使用String.utils的jar包,需要将jar包加入configuration阶段的classpath中


有两个地方,一个是build.gradle,一个是compile。第二个我们知道怎么做

我们需要用到buildscript,要把jar包加入到buildScript的classpath中,然后就可以在build.gradle中使用了

同样的,如果我们写了一个新插件比如MyPlugin,如果想使用,也需要加入到buildScript的classpath中。而buildSrc就是gradle提供的为我们做这件事的工具。

buildSrc该如何使用呢?比如我们想使用组件封装以下的这段创建task的逻辑:

1)在项目工程的根目录下创建buildSrc目录(注意不是创建模块),这个名字不能错,必须是buildSrc。
创建完之后,rebuild一下工程,会在buildSrc下生成一些目录,必须执行rebuild,会生成.gradle和build两个目录,不行就多试几次
2)在buildSrc目录下创建build.gradle文件,并编写代码

如果想使用别的插件,可以丰富内容:

3)在buildSrc目录下创建src/main/groovy目录(必须是这个目录名称)
之后再创建插件的包名:com.abc.myplugin,再创建类MyPlugin(包名和类名可以自定义)
并编写插件代码:

4)在buildSrc目录下创建src/main/resources目录,在resources目录下创建目录META-INF/gradle-plugins目录(注意,目录名称必须是这个)
最后在该目录下编写插件属性文件buildSrcPlugin.properties文件(属性文件命名可以自定义,但必须是“xxx.properties”的格式)
buildSrcPlugin.properties文件内容编写插件的全类名:
注意,key的名称必须为 “implementation-class”

到这插件的创建就完成了,下面就是如何使用插件。
5、使用插件有两种方式
第一种是通过插件完整类名引入
第二种是通过属性文件名引入,这种方式需要编写属性文件

背后的原理是什么呢?? gradle会先编译运行buildSrc,会把jar包添加到build.gradle的classpath中,你就可以使用了。
如果你想要发布独立的插件,插件写法跟buildSrc写法一样,唯一的区别是build.gradle文件要这样写:


然后执行上面写的uploadArchives任务会在你项目的com.mn.plugin目录下生成standardAlonePlugin.jar包,然后像这样去引入即可:

gradle相关面试题:


浙公网安备 33010602011771号