构建基础

Projects 和 tasks

projects 和 tasks是 Gradle 中最重要的两个概念。
任何一个 Gradle 构建都是由一个或多个 projects 组成。每个 project 包括许多可构建组成部分。 这完全取决于你要构建些什么。举个例子,每个 project 或许是一个 jar 包或者一个 web 应用,它也可以是一个由许多其他项目中产生的 jar 构成的 zip 压缩包。一个 project 不必描述它只能进行构建操作。它也可以部署你的应用或搭建你的环境。不要担心它像听上去的那样庞大。 Gradle 的 build-by-convention 可以让您来具体定义一个 project 到底该做什么。
每个 project 都由多个 tasks 组成。每个 task 都代表了构建执行过程中的一个原子性操作。如编译,打包,生成 javadoc,发布到某个仓库等操作。

Hello world

可以通过在命令行运行 gradle 命令来执行构建,gradle 命令会从当前目录下寻找 build.gradle 文件来执行构建。我们称 build.gradle 文件为构建脚本。

第一个构建脚本

build.gradle

  1. task hello {
  2. doLast {
  3. println 'Hello world!'
  4. }
  5. }

然后在该文件所在目录执行 gradle -q hello

-q 参数的作用是什么? 该文档的示例中很多地方在调用 gradle 命令时都加了 -q 参数。该参数用来控制 gradle 的日志级别,可以保证只输出我们需要的内容。具体可参阅Gradle 日志

执行脚本

  1. wjs@wjsdeMBP temp % vi build.gradle
  2. wjs@wjsdeMBP temp % gradle -q hello
  3. Hello world!

快速定义任务

用一种更简洁的方式来定义上面的 hello 任务。
build.gradle

  1. task hello {
  2. println 'Hello world!'
  3. }

通过 API 进行任务之间的通信 - 增加任务行为

  1. task hello << {
  2. println 'Hello Earth'
  3. }
  4. hello.doFirst {
  5. println 'Hello Venus'
  6. }
  7. hello.doLast {
  8. println 'Hello Mars'
  9. }
  10. hello << {
  11. println 'Hello Jupiter'
  12. }
  13. Output of gradle -q hello
  14. > gradle -q hello
  15. Hello Venus
  16. Hello Earth
  17. Hello Mars
  18. Hello Jupiter

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

增加自定义属性

可以为一个任务添加额外的属性。例如,新增一个叫做 myProperty 的属性,用 ext.myProperty 的方式给他一个初始值。这样便增加了一个自定义属性。

为任务增加自定义属性

build.gradle

  1. task myTask {
  2. ext.myProperty = "myValue"
  3. }
  4. task printTaskProperties << {
  5. println myTask.myProperty
  6. }
  7. Output of gradle -q printTaskProperties
  8. \> gradle -q printTaskProperties
  9. myValue

定义默认任务

Gradle 允许在脚本中定义多个默认任务。

定义默认任务

build.gradle

  1. defaultTasks 'clean', 'run'
  2. task clean << {
  3. println 'Default Cleaning!'
  4. }
  5. task run << {
  6. println 'Default Running!'
  7. }
  8. task other << {
  9. println "I'm not a default task!"
  10. }
  11. Output of gradle -q
  12. \> gradle -q
  13. Default Cleaning!
  14. Default Running!

依赖任务的不同输出

build.gradle

  1. task distribution << {
  2. println "We build the zip with version=$version"
  3. }
  4. task release(dependsOn: 'distribution') << {
  5. println 'We release now'
  6. }
  7. gradle.taskGraph.whenReady {taskGraph ->
  8. if (taskGraph.hasTask(release)) {
  9. version = '1.0'
  10. } else {
  11. version = '1.0-SNAPSHOT'
  12. }
  13. }
  14. Output of gradle -q distribution
  15. \> gradle -q distribution
  16. We build the zip with version=1.0-SNAPSHOT
  17. Output of gradle -q release
  18. \> gradle -q release
  19. We build the zip with version=1.0
  20. We release now