Gradle学习笔记(五)

来源:互联网 发布:python 创建数据库 编辑:程序博客网 时间:2024/06/05 09:25

上一篇我们学了一些基本操作,比如任务依赖,动态任务,操作已存在的任务等等,接下来我们继续:

快捷的表示方法:

你可能注意到前面的例子中,我们有一个方便的方式去操作已经存在的任务。每一个任务都作为构建脚本的一个属性存在。

例如:

build.gradle

task hello << {println 'Hello World!'}hello.doLast{println "Greetings from the $hello.name task."}
gradle -q  hello 的输出为:

Hello World!
Greetings from the hello task.

注意:

又遇到一个坑:如果把上面的  println "Greetings from the $hello.name task."  这一句的双引号改为单引号,你会发现输出的是:Greetings from the $hello.name task.  前面也举过这样的例子,我想大家应该知道单引号双引号  的 区别了
这使得对于任何可读的gradle代码,特别是当使用的任务是以插件的形式提供时,更易于操作任务,比如编译任务。

任务(task)其他的属性:

你可以为一个任务(task)添加你自己定义的属性,添加一个属性名为  myProperty,为  etc.myProperty 赋 一个初始值,从这一刻开始,这个属性可以被读写就像一个提前定义过的属性一样。

例子:

build.gradle:

task myTask {ext.myProperty = "myValue"}task printTaskProperties << {println myTask.myProperty}

gradle -q printTaskProperties 的输出为:

>gradle -q printTaskProperties
myValue

使用Ant 任务:

在Gradle 中能够很好的支持 Ant 任务,Gradle 通过简单的依赖Groovy 能够为 Ant 任务 提供极好的整合。Groovy 装载了出色的 AntBuilder。通过Gradle 使用Ant 任务比通过 build.xml 使用Ant任务 更方便并且功能更强大。通过下面的例子,我们可以学到如何执行一个Ant 任务以及如何 访问 Ant 任务的 属性。

例子:

首先在当前 build.gradle 所在的目录下新建一个目录 testDir,之后再新建两个文本文件,内容随便写,之后开始编写以下代码:

build.gradle

task loadfile << {def files = file('testDir').listFiles().sort()files.each { File file ->if(file.isFile()){ant.loadfile(srcFile: file,property: file.name)println "*** $file.name ***"println "${ant.properties[file.name]}"}}}
执行 gradle -q loadfile 的输出为:

>gradle -q loadfile
*** 新建文本文档 (2).txt ***
这是文档2
世界,你好
*** 新建文本文档.txt ***
这是文档1

以上只是一个简单的在构建代码中使用Ant 任务的例子,在后面我们会学习更多相关内容。

使用方法(Method):

Gradle scales in(这个单词翻译不好,为了不歪曲本意,所以不做翻译,有会的可以留言,谢谢)你如何组织你的构建逻辑,组织你的构建逻辑的第一个层级的方法就像下面的例子一样,是抽取一个方法。

Example:

tips:文件夹和文件仍然使用前一个例子的不做改变

build.gradle

task checksum << {fileList('testDir').each{File file -> ant.checksum(file: file,property: "cs_$file.name")println "$file.name Checksum: ${ant.properties["cs_$file.name"]}"}}task loadfile << {fileList('testDir').each{File file ->ant.loadfile(srcFile: file,property: file.name)println "I'm fond of $file.name"}}File[] fileList(String dir){file(dir).listFiles({file->file.isFile()} as FileFilter).sort()}
运行以下命令得到输出:


>gradle -q loadfile
I'm fond of 新建文本文档 (2).txt
I'm fond of 新建文本文档.txt
>gradle -q checksum
新建文本文档 (2).txt Checksum: 02a120115c8a97fc34a311f08428a3fe
新建文本文档.txt Checksum: b9c4c5f00c4d30f1c71dfe61609e7879

在后面的学习中你将会体会到类似这样的方法在多项目构建时可以在各个子项目之间共享使用(笔者理解:提高代码的重用率,避免相同的代码重复写),如果你的构建逻辑变得非常复杂,Gradle 提供了非常便捷的方式去组织它们,在后面的章节会学到。

默认任务:

Gradle 允许你定义一个或多个默认任务,如果没有指定要执行的任务,这些任务将被执行。

Example:

build.gradle

defaultTasks 'clean','run'task clean << {println 'Default Cleaning!'}task run << {println 'Default Running!'}task other << {println "I'm not a default task!"}
运行以下命令将输出:

>gradle -q
Default Cleaning!
Default Running!
这种方式等价于执行  gradle  clean  run,在一个多项目构建中每一个子项目可以拥有它自己指定的默认任务。如果一个子项目没有明确指定默认任务,那么会使用父项目的默认任务(前提是父项目定义了默认任务)。

通过 DAG 配置:

在后面的章节我们会详细介绍,Gradle 有一个配置阶段和一个执行阶段,在配置阶段结束后,Gradle 就知道了要执行的所有的 任务。Gradle 给你提供了一个 hook(钩子,相当于一个用户接口interface)去使用这些信息。其中一个使用情景就是:可以检查 发布任务 是否在要执行的任务之中,依靠它,我们可以为一些变量赋不同的值。

在下面这个例子中,任务 distribution 和 release的执行导致 版本 变量得到不同的值。

build.gradle

task distribution << {println "We build the zip with version=$version"}task release(dependsOn: 'distribution') << {println "We release now"}gradle.taskGraph.whenReady{taskGraph -> if(taskGraph.hasTask(release)){version = '1.0'}else{version = '1.0-SNAPSHOT'}}
执行以下命令:

>gradle -q distribution
We build the zip with version=1.0-SNAPSHOT
>gradle -q release
We build the zip with version=1.0
We release now
得到上面的结果,最重要的是: whenReady 影响了 release 任务在它执行之前。当release 任务不是主要的 任务时它也会起作用。

接下来学习什么:

从前面的几篇博客直到现在,我们第一次接触了 task(任务),但并没有学习结束,在后面的章节中我们会学习更多关于task的知识。




1 0
原创粉丝点击