2020-08-28

Gradle构建项目深入浅出

Kotlin in Action

文章目录

  • 系列文章目录
  • 前言
  • 一、gradle安装及入门使用
  • 二、gradle的project和task
  • 三、gradle的依赖管理
  • 五、gradle增量式更新任务
  • 六、gradle常用插件
  • 七、gradle依赖冲突
  • 八、gradle插件自定义扩展
  • 九、gradle调用外部扩展
  • 总结

前言

这里主要记录基于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 要求至少定义一个依赖仓库,依赖仓库可以是文件系统,也可以是中心服务器。最常用的是 jcentermavenCentral

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()
    }
}

 

猜你喜欢

转载自blog.csdn.net/dhbdbsbsn/article/details/108286985