Android开发

Gradle学习2——开始使用Gradle

2017-10-14  本文已影响278人  sososeen09

学习本系列前可以下载相关的github项目gradleLearnDemo
地址:https://github.com/sososeen09/gradleLearnDemo

0 前言

如果把Gradle当做脚本来学习,对于那么多的DSL配置,我们似乎难以下手。在这一点上,我认为邓凡平的深入理解Android之Gradle这篇文章讲的很好,把Gradle当做一个编程框架来学习,这篇文章可以让我们从一个不同的视角来学习和理解Gradle。

1 Gradle 之hello world

新建一个build.gradle文件,然后输入以下内容

//task是一个任务,doLast 是一个action
task helloWorld {
    println 'hello world!'
    doLast {
        println 'hello World! do last'
    }
}

输入命令 gradle helloWorld,执行helloWorld这个task。结果如下:

hello world!
:helloWorld //这个代表的是helloWold任务
hello World! do last

可以看到task中的内容正确的执行了,在task中 doLast是一个action,此外还有一个叫作doFirst的action。doFirst、doLast都是闭包。顾名思义就是再任务开始执行的开始和最后执行该闭包中的内容。

对于doLast这个action,可以使用一个简单的左移操作符来替代:

//可以使用左移符号 << 来简单的代表doLast
task name << {
    println 'this is doLast action'
}

2 Gradle的命令

Gradle的执行有很多有用的命令,运行gradle --help就可以查看这些命令。

2.1 命令行选项

-?, -h, –help 打印所有可用的命令行选项,包含描述信息
-b, –build-file gradle构建脚本的默认命名约定为build.gradle ,使用这个命令可以执行一个指定名字的构建脚本(比如,gradle -b test.gradle)。
–offline 可以在离线模式下构建,仅在本地缓存中检查依赖是否存在。

2.2 参数选项

-D, –system-prop Gradle是以一个JVM进程运行的。和所有的Java进行一样,你可以提供一个系统参数 (例如 -Dmyprop=myvalue)。
-P, –project-prop 项目参数是构建脚本中可用的变量,可以使用这个选项直接向构建脚本中传入参数(如 -Pmyprop=myvalue)。

2.3 日志选项

-i, –info 在默认设置中,Gradle构建不会提供大量的输出信息。通过这个选项可以将Gradle的日志级别改变到INFO以获得更多信息。
-s, –stacktrace 如果构建在运行中出现错误,-s选项在有异常抛出时会打印简短的堆栈跟踪信息,帮助你进行调试。
-q, –quiet 只在出错的时候打印信息

2.4 帮助任务

tasks :显示项目中所有可运行的task,包括它们的描述信息。项目中应用的插件可能会提供一些额外的task。
properties:显示出项目中的所有可用的属性。某些属性是由Gradle的project对象提供的,project对象是一个构建的本质表现形式。其它的属性都是用户自行一的,要么来自于属性文件或者命令行选项,要么是直接在构建脚本重定义的。

例如:

  1. gradle -q helloworld
    表示静默执行helloworld任务 。-q 的意思是 quiet,也可以不带q
  2. gradle -q tasks
    列出gradle中的task
  3. gradle -q tasks –all
    列出gradle中更多的task

当然了这个命令行我们不需要死记硬背,忘记怎么使用的时候,运行一下 gradle --help命令即可查阅相关的命令。

3 守护进程

gradle有一个命令--daemon可以用来开启一个守护进程,这个守护进程以后台方式运行。开启完守护进程之后,下一次运行构建的将会变快,这是因为减少了启动Gradle的开销。

执行下面的代码:

task helloWorld {
    doFirst{
       println 'hello World! do first'
    }

    println 'hello world!'

    doLast {
        println 'hello World! do last'
    }
}

默认情况下,我们使用gradle helloWorld命令,可以看一下执行的时间:

hello world!
:helloWorld
hello World! do first
hello World! do last

BUILD SUCCESSFUL

Total time: 2.787 secs

然后我们使用命令 gradle --daemon helloWorld 运行构建

hello world!
:helloWorld
hello World! do first
hello World! do last

BUILD SUCCESSFUL

Total time: 4.522 secs

WTF,不是说开启守护进程,构建时间会减少吗,怎么还变多了?
不要急,我们再来运行一次 gradle --daemon helloWorld看看:

hello world!
:helloWorld
hello World! do first
hello World! do last

BUILD SUCCESSFUL

Total time: 1.228 secs

看到了没,这一次时间减少了很多。第一次构建时间变长是因为后台开启�这个守护进程也是需要开销的,但是开启了守护进程之后我们就可以轻快的玩耍了。

需要注意的是:

  1. 守护进程只会被创建一次
  2. 守护进程会在3小时空闲时间之后自动过期
  3. 想要重用守护进程,构建的时候要加上--daemon选项

--no-daemon 选项可以选择执行构建时不使用守护进程。
gradle --stop 命令可以手动停止守护进程。

3 Gradle Wrapper 包装器

在从Eclipse切换到Android Studio进行Android开发的时候,我在很长一段时间都不明白这个gradle Wrapper有什么作用。直到学习了Gradle的构建才了解到它的重要作用。
Gradle包装器是Gradle的核心特性,能够让机器在没有安装Gradle运行时的情况下运行Gradle构建,也可以让构建脚本运行在一个指定的Gradle版本上。
使用Wrapper被认为是最佳实践,这样在不同的机器上面,构建的版本就能够保证统一。使用了包装器的Gradle脚本非常适合作为自动化发布的一部分,比如持续集成。

3.1 配置包装器

为了能够让项目下载压缩过的Gradle运行时文件,定义一个类型为Wrapper的任务,通过gradleVersion属性指定你想要使用的Gradle版本。
不要求该任务的名字为wrapper,任何名字都可以。但是这个名字在Gradle的在线文档中使用,是一个默认的约定。

task wrapper(type: Wrapper) {
    gradleVersion = '3.3'
}

执行任务 `gradle wrapper' ,就会在构建脚本同级的目录下生成了包装器文件。

 build.gradle*
 gradle/
 .gradle/
 gradlew*
 gradlew.bat

gradle目录中的结构如下:

image.png

在gradle-wrapper.properties文件中包含了Wrapper的属性

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-bin.zip

.gradle 是存放下载下来的gradle的目录。

.gradle中存放文件.png

记住:只需在项目中运行一次gradle wrapper命令就可以了。而且通常情况下,我们最好把gradle wrapper文件提交到版本控制系统中去。

3.2 使用包装器

作为包装器内容的一部分,它提供了一个命令执行脚本。对于 *nix系统,如Linux、Mac Os系统,它是一个叫做gradlew的shell脚本;对于Windows操作系统,它是gradle.bat。使用它们运行构建和使用已安装的Gradle运行时运行构建是一样的。

gradle生成的脚本.png

对于android开发,假如我们在android studio中使用命令行工具 ,如clean任务。

./gradlew clean  //��Mac OS
gradlew clean //Windows

更多信息可以查看官方文档Wrapper

4 Gradle构建块

每个Gradle构建都包含三个基本构建块:project、task、property。每个构建至少包含一个project,进而包含一个或者多个task。project和task暴露的属性可以用来控制构建。

Gradle使用的是领域驱动设计(DDD)的原理为其自己的领域构建软件建模。因此,在Gradle API中有相应的类来表示project和task

Gradle API中有相应的类来表示project和task。这一点是要明确的,Gradle中的脚本实际上是转为代码来执行的。

4.1 项目Project

在Gradle术语中,一个项目(project)代表一个正在构建的组件,比如一个JAR文件,或一个想要完成的目标,如部署应用程序。
当构建进程启动后,Gradle基于build.gradle中的配置实例化org.gradle.api.Project接口,并且能够通过project变量使其隐式可用。

4.2 任务Task

任务动作 task action,定义了一个当任务执行时最小的工作单元。
任务依赖 task dependency,很多时候运行一个task之前需要运行另一个task。
Gradle task对应的API是org.gradle.api.Task 接口。

4.3 属性 Property

每个Project和Task实例都提供了可以通过getter和setter方法访问的属性。一个属性可能是一个任务的描述或者项目的版本。
你也可以定义自己的属性。Gradle允许用户通过扩展属性自定义一些标量。

5 总结

本文介绍了Gradle中task的基本使用、命令行的使用、包装器Wrapper的作用以及Gradle构建块的介绍。

下一篇,我们会开始介绍Project和Task的属性。

上一篇下一篇

猜你喜欢

热点阅读