要一直走下去

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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相关面试题:

 

posted on 2022-05-21 17:59  要一直走下去  阅读(858)  评论(0)    收藏  举报