Gradle构建项目深入浅出
Kotlin in Action
文章目录
前言
这里主要记录基于Kotlin的Gradle构建工程的基本使用和Gradle的基本性质及优势
提示:以下是本篇文章正文内容,下面案例可供参考
一、什么是Gradle?
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。面向Java应用为主。当前其支持的语言限于Java、Groovy、Kotlin和Scala。
二、gradle安装及入门使用
1.下载位置:www.gradle.org
2.安装过程:将压缩文件解压,并添加环境变量
3.测试安装:打开CMD键入gradle,见如下图说明安装成功
入门使用(基于kotlin构建项目):
1.创建工程:
2.修改配置文件:
3.测试运行:
三、gradle的project和task
1.概述:
Gradle中的所有内容都基于两个基本概念:项目(Project)和任务(Task)。每个Gradle构建都是由一个或多个project组成。每个project都是有一个或者多个任务组成。任务之间具有依赖关系,保证了任务的执行顺序。任务代表构建执行的一些原子工作。
2.project:
我们首先讲一下Project的概念。每个build.gradle 就对应一个project。构建中的每一个project,Gradle都会创建一个Project对象,并将这个对象与构建脚本相关联。简单的说,build.gradle是对一个Project对象的配置。以Android项目为例,在项目的根目录会有一个build.gradle文件,在每个模块的目录下也会有一个build.gradle 文件。
3.Task及Task生命周期:
任务是主要的工作执行者。每个任务有多个Action组成。
Task生命周期分为:扫描和执行两个过程
var name = "uname"//扫描时执行
doFirst{}//运行时执行
doLast{}//运行时执行
4.基本使用及依赖关系:
task("task1"){
doFirst{
println("this is task 1")
}
}
task("task2"){
doFirst{
println("this is task 2")
}
}.dependsOn("task1")
task("task3"){
doFirst{
println("this is task 3")
}
}.dependsOn("task2")
四、gradle的依赖管理:
依赖管理(在 build.gradle 中):
1、定义依赖仓库(repositories):
Gradle 要求至少定义一个依赖仓库,依赖仓库可以是文件系统,也可以是中心服务器。最常用的是 jcenter 和 mavenCentral。
2、申明依赖(dependencies):
和 Maven 类似,依赖的坐标直接为:group、name、version。此外,引入不同的插件会引入不同的依赖配置类别。
/**
* Gradle代码:
* 使用HttpClient为例添加依赖管理
*/
repositories {
mavenCentral()
jcenter()
}
dependencies{
compile(kotlin("stdlib"))
//compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.4.1'
compileOnly("org.apache.httpcomponents","httpclient","4.4.1")
}
五、gradle增量式更新:
如果我们将Gradle的Task看作一个黑盒子,那么我们便可以抽象出输入和输出的概念,一个Task对输入进行操作,然后产生输出。为了提高构建效率,Gradle引入了增量式构建的概念。在增量式构建中,我们为每个Task定义输入(inputs)和输入(outputs),如果在执行一个Task时,如果它的输入和输出与前一次执行时没有发生变化,那么Gradle便会认为该Task是最新的(UP-TO-DATE),因此Gradle将不予执行。一个Task的inputs和outputs可以是一个或多个文件,可以是文件夹,还可以是Project的某个Property,甚至可以是某个闭包所定义的条件。
- inputs.dir()
- inputs.file()
- outputs.dir()
- outputs.file()
task("printfilename"){
inputs.dir("src")//输入
outputs.files("des.txt")//输出
doFirst{
var dir = fileTree("src")
var des = file("des.txt")
des.appendText("")
Thread.sleep(3000)
dir.forEach{
if (it.isFile){
des.appendText(it.absolutePath)
des.appendText("\r\n")
}
}
}
}
六、gradle常用插件:
插件是包含一个或多个任务的合集
- application插件
- java插件
- war插件
七、gradle依赖冲突:
gradle会自动依赖最高版本的库文件
八、gradle插件自定义扩展:
task("mycopy",Copy::class){
from("")
into("")
}
task("mydelete",Delete::class){
setDelete("")
}
九、gradle调用外部扩展:
/**
* 执行一段java代码
*/
task("exejava"){
javaexec{
main = ""
classpath()
}
}