zhaoyu@home:~$

gradle-构建基础

概述

gradle的核心配置基于DSL(领域描述语言),DSL使用groovy。build.gradle是gradle的构建脚本,gradle会从当前目录中寻找build.gradle 文件执行构建。它定义了一个 project 和一些默认的 task。

构建基础

projects 和 tasks是 Gradle 中最重要的两个概念。任何一个 Gradle 构建都是由一个或多个 projects 组成。每个 project 包括许多可 构建组成部分。如,每个 project 或许是一个 jar 包或者一个 web 应用,也可以是一个由许多其他项目中产生的 jar 构成的 zip 压缩包。 每个 project 都由多个 tasks 组成。每个 task 都代表了构建执行过程中的一个原子性操作。如编译,打包,生成 javadoc,发布到某个 仓库等操作。

插件

gradle定义了一些列插件,可以在官网https://plugins.gradle.org/中查找。插件可以在plugins中定义,如下,添加了base的插件,base插件 可以结合Zip的任务type,创建一个压缩包。

plugins {
    id "base"
}
//...
task zip(type: Zip, group: "打包", description: "将资源打包成一个zip文件") {
    from "src"
    setArchiveName "basic-demo-1.0.zip"
}

下面我们运行gradlew zip,就可以完成打包任务。

任务

helloworld
task hello {
    doLast {
        println 'Hello world!'
    }
}

执行该任务命令如下,其中-q是控制日志级别的参数

gradle -q hello
快速定义任务
task hello << {
    println 'Hello world!'
}

上面脚本采用闭包的方式定义hello任务。

代码编写脚本
task count << {
    4.times { print "$it " }
}

上面脚本循环打印出0到3。

任务依赖
task hello << {
    println 'Hello world!'
}
task intro(dependsOn: hello) << {
    println "I'm Gradle"
}

上面脚本task intro依赖task hello。运行gradle -q intro输出如下

Hello world!
I'm Gradle
延迟依赖
task taskX(dependsOn: 'taskY') << {
    println 'taskX'
}
task taskY << {
    println 'taskY'
}

taskX在taskY之前定义,运行gradle -q taskX输出如下,其输出如下:

taskY
taskX
动态任务
4.times { counter ->
    task "task$counter" << {
        println "I'm task number $counter"
    }
}

上面脚本动态生成了4个任务。执行gradle -q task1输出如下:

I'm task number 1
任务交互

增加依赖

4.times { counter ->
    task "task$counter" << {
        println "I'm task number $counter"
    }
}
task0.dependsOn task2, task3

为已存在的任务添加依赖关系

增加任务的行为:

task hello << {
    println 'Hello Earth'
}
hello.doFirst {
    println 'Hello Venus'
}
hello.doLast {
    println 'Hello Mars'
}
hello << {
    println 'Hello Jupiter'
}

其输出如下:

Hello Venus
Hello Earth
Hello Mars
Hello Jupiter

doFirst和doLast可进行多次调用,分别添加在任务的开头和结尾,当任务开始时,这些动作会按照顺序执行。其中<<操作是doLast的简写。

脚本属性,如下为task的name引用,其中$hello.name为task hello的名称

task hello << {
    println 'Hello world!'
}
hello.doLast {
    println "Greetings from the $hello.name task."
}

自定义属性:也可以为task添加自定义属性。

task myTask {
    ext.myProperty = "myValue"
}

task printTaskProperties << {
    println myTask.myProperty
}

默认任务:

defaultTasks 'clean', 'run'
task clean << {
    println 'Default Cleaning!'
}
task run << {
    println 'Default Running!'
}
task other << {
    println "I'm not a default task!"
}

项目可以定义默认的任务,执行命令gradle -q就可以执行clean,run任务。每个子项目都可以指定单独的默认任务。如果子项目未进行指 定将会调用父项目指定的的默认任务。

创建目录
classesDir = new File('build/classes')
task resources << {
    classesDir.mkdirs()
    // do something
}
task compile(dependsOn: 'resources') << {
    if (classesDir.isDirectory()) {
        println 'The class directory exists. I can operate'
    }
    // do something
}  
列举所有任务

可以通过tasks命令,列举出项目可用的所有任务,包括,我们自己定义的任务和插件的任务。

gradlew tasks