计算机 · 2021年12月9日 0

gradle

官方文档

Features

  • Declarative builds and build-by-convention
  • Language for dependency based programming
  • Structure your build
  • Deep API
  • Gradle scales
  • Multi-project builds
  • Many ways to manage your dependencies
  • Gradle is the first build integration tool
  • Ease of migration
  • Groovy
    Gradle使用的编程语言是Groovy。
  • The Gradle wrapper

安装Gradle

在命令行中使用Gradle

task compile {
    doLast {
        println 'compiling source'
    }
}

task compileTest(dependsOn: compile) {
    doLast {
        println 'compiling unit tests'
    }
}

task test(dependsOn: [compile, compileTest]) {
    doLast {
        println 'running unit tests'
    }
}

task dist(dependsOn: [compile, test]) {
    doLast {
        println 'building the distribution'
    }
}
  • 想要运行某个task时,直接输命令:gradle taskname。gradle会按照task的依赖关系按顺序执行需要运行的task。
  • gradle task1 -x task2表示执行task1及其依赖的task,但是不执行task2。
  • --continue选项则表示遇到错误不要停止而是继续执行该执行的task。
  • 在命令行中输入task的名字时不需要输全名,可以只输入足够的可以唯一确定task的开头几个字母,或者只输入驼峰式的名字的开头字母(比如用cT表示compileTest)。
  • 使用-b选项选择要使用的gradle文件。执行gradle命令时,默认在当前目录寻找build.gradle文件,不过我们可以用-b选项手动指定一个gradle文件。当用-b选项指定gradle文件时,settings.gradle失效。
  • 类似make的工作原理,gralde在执行某些task时可能会根据依赖关系认为不需要真的去跑这个task,为了强制地重新跑这种task,需要加上--rerun-tasks选项。
  • -q选项不输出一些不重要的信息,安静模式。
  • gradle projects输出子工程。
  • gradle tasks列出所有的task。gradle tasks --all更进一步地列出了一些依赖的task。
  • gradle help --task taskname列出taskname这个task的相关信息。
  • gradle dependencies 列出工程的依赖关系。
  • gradle buildEnvironment 列出gradle脚本的依赖关系。
  • gradle properties列出工程属性
  • --profile选项,添加用时统计,进行profiling。
  • -m选项,类似于查看某个task的依赖关系。

Gradle Wrapper

有时用户可能没有装gradle或者装的gradle版本不符合要求,gradle wrapper文件就是用来解决这种问题的。

生成gradle wrapper

  1. 通过命令生成:gradle wrapper --gradle-version 2.0
  2. 通过在build.gradle中添加一个Wrapper task,然后执行这个task生成:task wrapper(type: Wrapper) { gradleVersion = '2.0' }

生成了所谓的gradle wrapper之后,项目文件夹内会多出以下文件:

gradlew(Unix Shell script)
gradlew.bat(Windows batch file)
gradle/wrapper/
    gradle-wrapper.jar(Wrapper JAR)
    gradle-wrapper.properties(Wrapper properties)

有了gradle wrapper之后,在运行相应的task的时候,就不再用gradle命令而改为gradlew或者gradlew.bat命令。相应的gradle版本会被下载到目录*$USER_HOME/.gradle/wrapper/dists*。

对于gradle.properties这个文件,我们可以修改其中的gradle文件的下载地址,添加下载时可能需要的认证过程的用户名和密码,或者设置要下载的gradle版本的SHA-256值。具体操作见官方文档第6章。

Gradle Daemon

gradle程序每次启动时都要初始化JVM和载入一堆相应的库,这些操作都需要花费相当的时间,我们可以通过在后台跑一个一直在运行着的gradle守护进程来减少这样的启动时间的消耗,提高gradle的执行效率。不过这个gradle daemon功能是从3.0版本才开始有的,具体相关用法查看官方文档第7章。

gradle的依赖管理

依赖主要包含两部分:

  • dependencies
    为了构建或者运行项目而需要的东西(incoming);
  • publications
    项目的产出,会拿来发布或者上传的东西(outgoing);

dependencies resolution;transitive dependencies;

声明依赖

声明依赖的简单例子:

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}

依赖配置(Dependency configurations)

一个依赖配置是指的一个有名字的依赖和artifacts的集合。依赖配置的作用:

  1. 声明依赖
  2. 解决依赖
  3. 暴露接口?(Exposing Artifacts for Consumption)
    The plugin uses configurations to define what artifacts it generates for other projects to consume。

几种由Java Library Plugin定义好的依赖配置:

  • implementation
  • runtimeClasspath
  • apiElements

关于Java Library Plugin提供的更多配置及细节、以及更多的Plugin和相应的配置细节

声明外部依赖

例子:

dependencies {
    compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
}

简化版:

dependencies {
    compile 'org.hibernate:hibernate-core:3.6.7.Final'
}

仓库(Repositories)

repositories {
    mavenCentral()
}

repositories {
    jcenter()
}

repositories {
    maven {
        url "http://repo.mycompany.com/maven2"
    }
}

repositories {
    ivy {
        url "http://repo.mycompany.com/repo"
    }
}

repositories {
    ivy {
        // URL can refer to a local directory
        url "../local-repo"
    }
}

一个项目可以配置多个仓库,Gradle会按顺序挨着在这些仓库寻找依赖,直到找到需要的依赖。

发布作品(Publishing artifacts)

上传到Ivy repository:

uploadArchives {
    repositories {
        ivy {
            credentials {
                username "username"
                password "pw"
            }
            url "http://repo.mycompany.com"
        }
    }
}

或者上传到Maven repository:

apply plugin: 'maven'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "file://localhost/tmp/myRepo/")
        }
    }
}

多项目工程的构建

多项目工程构建的结构(Structure of a multi-project build)

这样的构建一般具有如下特点:

  • 在根目录或者master目录里有一个settings.gradle文件
  • 在根目录或者master目录里有一个build.gradle文件
  • 在子目录中有着各自的的*.gradle文件。

settings.gradle文件告诉Gralde次项目是如何与子项目联系在一起的。可以通过读这个文件或者运行gradle -q projects命令来了解项目与子项目的结构。
一个输出示例:

> gradle -q projects

------------------------------------------------------------
Root project
------------------------------------------------------------

Root project 'multiproject'
+--- Project ':api'
+--- Project ':services'
|    +--- Project ':services:shared'
|    \--- Project ':services:webservice'
\--- Project ':shared'

To see a list of the tasks of a project, run gradle <project-path>:tasks
For example, try running gradle :api:tasks

执行多项目工程的构建

  • cd到子项目目录里,然后按照一般的项目执行task的方式,用gradle <task>命令执行task。但是需要注意的是,gradle会执行当前目录及其子目录所包含项目的所有名为task的task。
  • 在根目录使用完整的task的名字执行task:gradle :services:webservice:build

持续构建(Continuous build)

持续构建是还在发展中的特性,Gradle还没有完善地实现这一功能特性。
持续构建:对于一个构建目标/请求,Gradle能够不断地检测之前的构建是否过期,如果过期就执行相应的构建操作。
有空再来读这官方文档的第10章。

组合构建(Composite build)

构建环境的设置

主要是通过修改gradle.properties这个文件来配置构建环境。

构建缓存(Build Cache)

编写Gradle脚本

由于这部分内容太多,所以重新写一篇吧来描述这部分内容。