第6章 构建脚本基础(6.1-6.5)
6.1. 项目和任务
Gradle里的一切都基于这两个基本概念:项目和任务(projects and tasks)
每个Gradle构建都由一个或多个项目构成。一个项目代表什么取决于你想要用Gradle去做什么。举个列子,一个项目可能代表一个Jar或者一个web应用,它也可能代表一个由其他项目生成的jar包组成的ZIP压缩包。项目不必代表准备构建的东西,它可能代表准备完成的事情,如,部署你的应用到生产环境。如果你仍感觉有些模糊也不用担心。Gradle的惯例构建的支持,增加了对项目是什么更加充分的定义。
每个Gradle项目都由一个或多个任务构成。任务代表构建执行的一些原子级别的操作,可能是编译一些classes,创建一个Jar,生成Javadoc,把一些存档(archives)发布到仓库(repository)。
目前,我们将关注在单项目构建中定义一些简单的任务。之后的章节中,我们会关注多项目构建,以及多项目和多任务混合的构建。
6.2.Hello world
使用gradle命令运行Gradle构建,gradle命令会在当前目录下寻找名为build.gradle的文件,我们称这个文件为构建脚本(buildscript),虽然确切来说,它是一个构建配置脚本(build configuration script)。这个脚本定义了一个项目和它的一些任务。
试着创建下面名为build.gradle的构建脚本。
例子6.1第一个构建脚本
build.gradle
task hello{ do last{ println 'hello word!' }}
在命令行里,进入该构建脚本所在目录,通过命令gradle -q hello来执行这个构建脚本。
例子6.2脚本的执行
gradle -qhello命令的输出
> gradle -q hello
Hello world!
这里发生了什么?上面的构建的脚本定义了一个单一的任务,hello,给它添加了一个action,当你运行gradle hello,Gradle执行hello任务,接着就执行你提供的action,这个action是一个简单的包含了一些Groovy代码的闭包。
如果你觉得这些看上去和Ant的目标(targets)很相似,好吧,你是对的。Gradle任务等同于Ant中的目标,但是,你会看到gradle任务是更加强大的。我们使用一个不同于Ant的术语,是因为我们认为任务(task)比目标(target)更加贴切。不过,这里术语的使用和Ant产生了冲突,在Ant中,称命令为任务,如javac和copy,因此当我们说到任务时,总是指的是Gradle里的任务,等价于Ant中的目标,而说到Ant任务时,会明确地说成Ant任务(anttask)。
6.3快捷任务定义
有一种定义任务的简洁方式
例子6.3快捷任务定义
build.gradle
task hello << { println 'Hello world!'}
再次,这定义了一个叫做hello的任务,它是一个可以执行的闭包,在贯穿整个用户手册中,我们使用这种定义任务的方式。
6.4构建脚本代码
Gradle构建脚本向你展示Groovy的所有能力,作为开胃菜,看看这个:
例子6.4在Gradle任务中使用Groovy
build.gradle
task upper << { String someString = 'mY_nAmE' println "Original: " + someString println "Upper case: " + someString.toUpperCase()}
使用gradle-q upper,你就会看到以下输出:
> gradle -q upper
Original: mY_nAmE
Upper case: MY_NAME
6.5任务依赖
正如你可能已经猜到的,你可以申明任务之间的依赖性。
例子6.6申明任务之间的依赖性
build.gradle
task hello << { println 'Hello world!'}task intro(dependsOn: hello) << { println "I'm Gradle"}
使用gradle -q intro,你就会看到以下输出:
> gradle -q intro
Hello world!
I'm Gradle
再加入一个依赖之前, 这个依赖的任务不需要提前定义了,来看下面的例子。
build.gradle
task taskX(dependsOn: 'taskY') << { println 'taskX'}task taskY << { println 'taskY'}
使用gradle -q taskX,输出如下:
> gradle -q taskX
taskY
taskX
taskX 对taskY的依赖性在taskY定义之前就被申明了,这中定义方式对多项目构建来说是非常重要的。任务依赖性的更多细节将会在15.4中讨论。
注意,当你将要引用的任务还没有定义时,不要使用快捷标记。(参考6.8)