您的位置:

深入探究gradle build的各个方面

一、gradle build的基本介绍

Gradle是一个基于JVM的构建工具,主要特点是灵活性和可扩展性。Gradle构建过程包含了三个阶段:初始化阶段、配置阶段和执行阶段。gradlew是Gradle wrapper,它能让一个项目的用户使用指定版本的Gradle进行编译,而不需要安装任何Gradle的版本。

二、gradle build的配置文件

Gradle的构建是由Groovy或Kotlin脚本编写的,它们是放在build.gradle文件中的。Gradle的配置文件由两部分组成:Project和Task,它们都是对象。在Gradle中,Project对象表示整个构建,并且在Gradle的配置文件中表现为根项目,而Task对象则表示Gradle构建中的一个单元。使用配置文件我们可以定义项目相关的属性,配置插件,以及定义task等。

三、gradle build中常用的task

在Gradle的配置文件中,常常会使用Gradle中的Task。Task是指构建中的一个单元。我们可以通过依赖关系来定义task,也可以通过插件来创建task。在Gradle中,内置了很多task,这里我们只介绍几个常用task。

  • clean:删除构建文件夹,这个task只有一个action,即删除指定文件夹下的所有内容
  • compileJava:编译Java源文件,它的依赖关系是Java源文件,Java编译器和编译输出目录。如果源文件在修改或者删除,这个task将重新运行
  • test:运行单元测试
  • build:执行clean、compile和test等操作
task clean(type: Delete) {
    delete rootDir.path + '/build'
}

task build(dependsOn: ['clean', 'compileJava', 'test'])

四、gradle build中的插件

插件是Gradle的一个核心概念。通过插件,users可以使用Java、Groovy、Scala等语言开发各种各样的应用。Gradle插件以Jar文件的形式出现,可以通过Gradle仓库和Maven仓库进行下载。通过使用其他人写的插件,我们可以使用一些预制的Task,或者针对一些应用场景提供的特殊功能。

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
    }
}

apply plugin: 'java'

五、gradle build中的依赖管理

Gradle的依赖管理非常灵活,可以定义项目的依赖关系,引入第三方的jar包等等。

  • 引入外部依赖
    可以使用Maven的依赖语法,通过mavenCentral或jcenter仓库来拉取外部依赖。
  • 定义项目依赖关系
    在Gradle中,可以通过dependencies块和称作依赖配置(Dependency Configuration)的块来定义一个项目的依赖关系。
apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile 'junit:junit:4.12'
    compile group: 'commons-lang', name: 'commons-lang', version: '2.6'
}

六、gradle build中的额外配置

在Gradle中,可以使用buildSrc目录下的build.gradle文件来定义一些额外配置,这些配置都是来增强Gradle本身的功能。比如添加一个自定义Task,构建脚本中经常会使用到,这样可以让构建逻辑的复用性更好。

plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
}

task prettyPrintJson(type: JavaExec) {
    main = "com.google.gson.JsonParser"
    classpath = sourceSets.main.runtimeClasspath
    standardInput = System.in
    args = [
            '-n',
            '-i', 'src/main/resources/test.json'
    ]
    workingDir = file("$projectDir")
}