版权声明:本文为 newtrekWang 原创文章,可以随意转载,但必须在明确位置注明出处!!!

gradle.org

参考资料

Groovy

Gradle

从移动应用到微服务,从小型创业公司到大企业,Gradle帮助团队更快地构建,自动化并交付更好的软件。

例子1:一个简单的Gradle项目

本例子将创建一个简单的Gradle项目,仅通过命令行调用一些基本的Gradle命令,主要目的是了解Gradle如何管理项目

准备环境

注:我的电脑系统是win10系统,所以相关命令行用的是cmd

Java环境

gradle环境

初始化工程BasicDemo

新建BasicDemo文件,进入BasicDemo目录

执行 init 任务(Task)

任务执行后,查看初始化后默认的工程结构

简单介绍下:
1.build.gradle:项目配置脚本,用于配置当前项目中的任务
2.gradle-wrapper.jar:Gradle Wrapper可执行文件JAR
3.gradle-wrapper.properties:Gradle Wrapper配置属性
4.gradlew:用于基于Unix的系统的Gradle Wrapper脚本
5.gradlew.bat:适用于Windows的Gradle Wrapper脚本
6.settings.gradle:用于配置哪些项目参与构建的设置配置脚本

查看脚本

build.gradle

当前build.gradle没有任何可执行的脚本,只有一个应用java插件的模板脚本,脚本是被注释了的
setting.gradle

只有一句rootProject.name是设置项目名字的

查看默认的所有的Tasks

gradlew tasks相当于让gradle执行本项目的tasks任务,该任务会列出所有的task,有上面的内容可以知道:
在Build Setup 任务组里面有init,wrapper两个task,Help任务组里面有buildEnvironment,components等任务,每项任务后面有介绍。

所以这些任务是通用的,不管是什么项目都会有这些基本的Task

创建一个Task

Gradle提供了用于通过基于Groovy或Kotlin的DSL创建和配置任务的API。一个项目通常包括多个任务组,每个任务组里的每个任务都执行一些基本操作。通过这些任务的组合,依赖构成了一个项目的比如说编译,打包,调式等过程,实际上IDEA那些按钮最终执行的也是这些任务

Gradle附带一个可以在自己的项目中配置的任务库,所以我们可以利用这些任务库来定义自己想实现的任务

例子:复制文件,将src文件夹里的文件复制到dest文件夹中
步骤:
1. 创建一个src文件夹

2.在src目录下放一个文件,比如myfile.txt

3.在build.gradle定义copy这个任务

4.在看看现在该项目有没有我定义的copy任务

可以看到在Custom tasks已经有copy这个任务了

5.最后执行copy任务,看是不是真的有效果

可以看到,src目录下的文件已经复制到dest文件夹里了,证明自定义的copy任务是可行的

应用一个Gradle插件

成千上万的任务怎么管理,不可能都放在一起吧,所以gradle用插件来集成一些具有特定功能的任务集合,比如要构建Android应用程序就要用com.android.application这个插件,构建java应用要用java这个插件,目前gradle里面已经有很多现成的插件了,可以https://plugins.gradle.org了解一下。其实很多开源框架附带有配套的gradle插件,你要是觉得不够自定义,自己也可以造一个

应用base插件
base插件里有一个Zip核心类型,我们可以用它来做一些文件压缩操作
1.在builde.gradle添加应用插件的脚本

2.定义zip任务,将src文件压缩为basic-demo-1.0.zip

3.执行zip任务

可以看到build/distributions目录下有basic-demo-1.0.zip这个压缩文件,证明插件应用成功

探索和分析构建

查看可用的Task

执行gradlew tasks这句命令,可以查看当前项目可用的Task,包括基本插件添加的和你自己定义添加的

使用 build scan

Gradle还为您的构建提供了一个丰富的,基于Web的视图,称为构建扫描。
例子:在刚才的zip任务后面加上--scan

然后进https://gradle.com/s/gfdgkrh3xihcu这个网址,填入你的邮箱,然后会发一封邮件给你,邮件里就有构建分析链接,界面如下图:
buildscan

很有档次,那些大厂,有自己成熟的自动化流程才用这个功能吧

例子2 构建一个简单的Java应用程序

1.初始化项目BasicJava

新建BasicJava文件夹,使用gradle init命令

2.build.gradle添加java和application插件

java插件里有很多与java程序相关的构建任务;application插件有运行程序的任务;repositories设置依赖仓库来源,常见的就是jcenter();dependencies设置程序依赖的第三方库,构建的时候会从依赖仓库去下载,比如上面就依赖了slf4f和junit

3.执行gradlew tasks,看看有哪些任务

4.新建Java源码包和编写Java源码

java插件默认以src/main/java目录下作为源码存放路径,你也可以在build.gradle里设置源码路径

App.java

记得在build.gradle里设置好入口函数的位置,我这里就是mainClassName = 'com.newtrekwang.basicjava.App'

5.执行gradle run 运行Java程序

  1. 打包为可执行的jar文件
    在build.gradle里添加jar设置,java插件自带jar任务,必须要配置manifest,否则打出来的jar包没有入口函数不能执行。

执行gradlew jar ,然后就可以在build/libs目录下看到生成的jar文件了
jar

执行jar文件

例子3 构建Android应用程序(多模块)

构建Android应用程序主要是要用com.android.tools.build:gradle这个库里的com.android.application插件

因为Android Studio在创建项目的时候已经为我们生成了相关的文件夹和基本的脚本文件,所以我们直接用AS创建一个Android工程
比如我创建了个Test工程:
Test

实际上这个目录结构与前面的BasicDemo很类似,可以看作就是在BasicDemo上扩展的,只不过用到的Gradle插件不同,所以文件夹结构也就有所不同。

根目录的build.gradle

因为Android项目一般是多模块的,就是一个项目可以有多个应用模块或者依赖模块,所以根目录的build.gradle里的内容一般与多模块的公共配置有关

包含buildscript和allproject两个块,还有个clean任务,buildscript配置脚本的来源和脚本类路径,repositories设置脚本仓库地址,dependencies设置依赖那个库,比如这里用的是com.android.tools.build:gradle:3.1.2,因为子模块要用application这个插件,不设置的话会获取不到这个插件。allprojects设置整个工程和子模块的依赖仓库来源,常见的就是google()和jcenter()

gradle脚本大量用到了groovy的闭包语法,闭包可以当方法参数,而且调用方法可以不用加点,不用加圆括号,不熟悉的同学可以先去练下groovy闭包

比如

实际上是执行了project对象的allprojects方法,传入了

这个闭包,然后闭包里又调用了project对象的repositories方法,传入了

这个闭包,然后这个闭包里调用了RepositoryHandler对象的google()和jcenter()这两个方法(闭包是可以改代理的,所以repositories方法的实现肯定是改了闭包的代理的,因为默认的project对象没有google(),jcenter()这两个方法)

根目录的setting.gradle

配置项目包含哪些模块,比如这里有个app模块,那就把app这个文件夹添加上去

app目录下的build.gradle

首先应用了com.android.application这个插件,然后在相应的android,dependencies方法中通过闭包设置各种配置,依赖,具体指的是啥,这里暂时不展开叙述。

用AS查看Task

tasks
AS有个gradle工具窗口,从中可以查看所有的任务,这里是两个分组,一个总工程Test的,一个app模块的,再展开就能看到具体的task了,并且点击可以执行任务

例子4 模仿Android插件,定义一个简单的gradle插件

模仿结果:定义一个com.newtrekwang.application插件,可以配置类似如下的脚本,然后脚本运行后打印出所有的配置信息。主要目的是了解Android插件的执行流程,为什么可以这样配置

1.为了快速构建,用IDEA新建一个gradle工程,build.gradle应用groovy和maven插件。
build.gradle

setting.gradle

工程目录:
工程目录

2.在/src/main/groovy里面编写插件源码,结构类似Java工程
因为android块里有defaultConfig块和buildTypes块,defaultConfig块里都是字段,所以定义一个Config类,buildTypes块里是数组,所以定义一个BuildType放单元素里的字段

Config.groovy

BuildType.groovy

Androrid.groovy

3.再resources/META-INF/gradle-plugins里面添加插件配置文件,我的插件名叫myapplication.所以文件名为myapplication.properties

里面的内容是设置插件类的位置的

4.执行uploadArchives,打包插件为jar包并发布再指定路径

打包插件

5.验证插件
为了区分开来,我新建了另一个项目TestPlugin,专门用来测试插件,目录结构如下

TestPlugin

build.gradle

app/build.gradle

app里的build.gradle完全模仿Android插件的配置样子,插件名改为我的myapplication

配置完毕,同步下工程,会发现有printConfig任务
printConfig

最后执行printConfig任务
printConfig

可以看到控制台打印了所有配置信息,验证完毕,达到模仿效果

Hits: 13

分类: Android工具

发表评论

电子邮件地址不会被公开。 必填项已用*标注