Gradle学习2——开始使用Gradle

学习本系列前可以下载相关的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的属性。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容