Gradle-使用Gradle构建和测试-1-Hello,Gradle

来源:互联网 发布:ios app 访问数据库 编辑:程序博客网 时间:2024/06/08 07:06

原版电子书下载地址:Build and Test with Gradle.pdf

Chapter 1.Hello,Gradle

Ant和Maven在构建集(build continuum)中占据着对立的位置,使得在过去的十几年间对它们的用户同时受益和受害着。Ant在构建上对用户选择了极端的灵活性而没有任何约定(conventions),同时也不想利用任何的重量级的依赖管理框架(dependency management infrastructure )。 Apache Ivy对Java Builds不算好地加入了需要的依赖管理,但是仍然没有解决Ant内在的缺乏约定的问题。另一方面,Maven提供了严格的标准来支持依赖管理,但是它的标准是很霸道的,偏离它们通常会比预期的困难得多。

Ant和Maven在Java市场已经取得了相当大的成功,尽管两种工具都存在着大的缺陷。一方面,Gradle让自己表现为在两个极端之间的一个明智的中间地带,为你的build提供了体贴的要遵循的约定,同时它很容易进行扩展或者重新定义你想要的约定。Gradle提供了随时即用的构建约定,同时意识到没有一套标准可以真正的反射每一个build。因此Gradle旨在成为开发组织(developing organization)以及特定项目(project-specific)构建标准的一种手段。它被认为最好之处在于它不是作为构建标准上的一组意见,而是作为一种工具箱去使用丰富的描述性的语言来开发和扩展它们的标准。

Gradle在处理构建依赖上也给了多种选择。如果你的项目习语(idiom)是通过名称来声明一些顶层的依赖,并且让你的构建工具来决定其他库是否必须要支持声明的依赖(“transitive dependency management”传递性依赖管理),Gradle将会让你可以那样做,通过与Mavan和Ivy仓库交互。如果你想下载JAR文件并在本地项目目录手动管理它,Gradle也不会对你有不利。两种方式都是一流的选择。在很多情形下这种灵活性是很重要的,尤其是在迁移builds到Gradle的时候:不管在依赖管理上的构建遗留问题,Gradle都不会抵抗他们。

Gradle有很丰富的特点,但它不是一种固执己见的框架,它不会去抵触你当你想要用自己的方式做一些事情的时候。它提供了约定给那些想要的人,也提供了灵活性给那些需要的人,同时提供了一个工具箱来把灵活性转变成特定领域(domain-specific)的你自己写的构建标准。除了它在约定/配置连续集上的微妙的位置,它还提供了有用的,高生成率的特点而不同于其他构建工具。我们将一起探索这些通过这些文章系列。

1.1 Build Files in Groovy 在Groovy中构建文件

一个可能的复杂构建文件将要求一种具有表现力的格式。在过去十几年间XML对于构建工具来说是一种简单的选择,因为那期间它是一种新技术,而开发者们对它也充满了热情,而且还没有人知道大文件阅读的痛苦。它看起来是对人可读的,也容易编写代码和解析它。然而,十几年的经验已经表明庞大而复杂的XML文件只对计算机阅读来说简单,而对人类则不是。而且,XML严格的分层结构限制了格式的表达性。在XML中很容易展示嵌套关系但很难表达程序流程和大多数编程语言的的数据访问方式。最终,对于build文件来说XML成为了一种错误的格式。

Gradle用Groovy来表达它的构建文件。Groovy是一种JVM下的动态语言,在很多方面与Java类似,但也有一些重大的区别。每一个Gradle构建文件都是一个可执行的Groovy Script。作为一个Gradle的初学者,你甚至不必关注你将要写的Groovy代码,而且随着你的需求越来越精细,Groovy语言的能力将会越显重要。与Ant和Maven的构建文件不同,Gradle的基于Groovy的构建文件允许你在构建文件中做一些通用的编程任务。这解决了开发者在Ant上因缺乏流程控制或在Maven上为了完成非标准任务而被迫进行插件开发所要面对的很多困难。

1.2 Domain-Specific Build Languages 特定领域构建语言

每一个要维护一个复杂构建文件的开发者在某一时刻都仅仅想在构建文件中写一点点代码。有时你仅仅需要一个迭代器,在其他时候你想要表达一个适度复杂的条件控制而不用去将主要的构建文件动大手术。但是通过一个复杂的构建来无限制的能力编写你的代码会是一件好事?这似乎开辟了灵活性的广阔的新前景,但最终可能会导致维护上的大灾难。由于Gradle构建文件是Groovy脚本,它给了你在你的构建文件中任意点上切入脚本模式的选择,但是过度这么做一般来说是不赞成的。

然而,Gradle致力于呈现给用户的不仅仅是Groovy,而是用定制的特定领域语言(DSL)来构建任务代码。Gradle用户可以学习下这门语言来有效使用Gradle,不是之前提到的Groovy。DSL使用习语来适应构建软件的任务,而不必适应通用语言。通用性编程通常作为一种可用的后备,但是Gradle首先轻轻地推动着用户向前使用DSL的习语,其次才是通用编程。

当标准的Gradle DSL 没有用来描述你想要你的构建来做什么的语言时,你可以通过插件的方式扩展DSL。例如,开箱即用的Gradle包含了需要描述如何构建你的Java代码的语言以及从输出中创建一个WAR文件。然而,它不包含需要运行数据库迁移的脚本或者部署代码到一个基于云计算的QA服务集的语言。通过Gradle 插件,你可以添加新的任务定义,改变已存在任务的行为,添加新的对象,创建新的关键字来描述分离于标准Gradle类的任务。另外,即使通过自定义Gradle任务的简单机制,你也能采用一小部分构建词汇表来将不可取的大片重要代码转变成清洁的声明。

如果你是来自于Maven的用户,那么你所对插件的理解将有别于Gradle插件的概念。在Maven中,插件是一种特别的扩展这个工具的方式,是构建过程中的一种细粒度的动作,通常与Maven精心制作的生命周期模型的一个或多个阶段相关联。在Gradle中,插件可以通过采用一个或多个任务来提供可配置的构建动作,但是根本上,它是一种通过插件扩展构建DSL来导入特定领域的方式。

使用和扩展Gradle DSL通常能更好地在你的构建文件中编写代码。同时你通常能以一种局部优化的方式通过在你的构建中编写Groovy代码来自由地解决问题,大多数可维护的构建将最终重构代码为有组织结构的插件,这些插件对构建文件暴露出新的构建语言习语。这样你可以在高的层次表达你的构建的活动和在你的业务及技术领域有意义的声明性语言。

1.3 Getting Started 入门指南

Gradle很容易安装。对于所有的平台,按照如下步骤:
1)访问 Gradle下载 下载当前的发布版本
2)解压下载的文件到你选择的目录
3)添加环境变量 GRADLE_HOME ,指向你的安装目录
4)添加 $GRADLE_HOME/bin 到你的path
提示:计算机-属性-高级-环境变量

1.4 The Hello World Build File

我们已经安装了Gradle,现在我们开始使用它。让我们构建最简单的构建文件,这样我们或许可以得到一个最基本的概念。创建一个文件命名为 build.gradle,如下例 1-1:
例1-1. Hello World build file

task helloWorld <<{    println 'hello,world'}

你将看到下面的输出结果:
$ gradle -q helloWorld
hello, world
注意到,build文件不需要包含任意东西,不依靠任何外部的依赖。当然它没有做太多事情,而只是打印出一条消息。
在我们进入构建Java代码之前,让我们再试一个例子。这一次,我们将使用两个任务,加入了依赖来做完同一个工作(例1-2)。
例1-2. Hello World in two tasks

      task hello <<{          print 'hello'          }           task world(dependsOn: hello) <<{            println 'world'         }

为了运行这个build,我们执行第二个任务,world. 很明显地它产生了和第一个例子类似的输出:
$ gradle -q world
hello, world

1.5 Building a Java Program 构建一个Java程序

当然,这个Helo World 例子是不自然的;没有人真的想执行一个build来只打印信息到控制台。让我们来看看用它来构建Java代码到底有多简单。本着介绍的目的,我们将写一个非常简单的Java程序,仅仅来展示Gradle创建一个build有多简单,如果你很好地适应它的约定。
例1-3.The Simplest Possible Gradle Build File for Java
apply plugin: ‘java’

源文件如下所示,例1-4.例1-4.Hello World in Java

    package simple;    public class HelloWorld{        public static void main(String[] args){            System.out.println("hello,world");        }    }

重要地是,项目的目录布局如下所示,例1-5.
例1-5.Project Layout of Hello World Jbuild.gradle

└── src └── main     └── java          └── simple                └── HelloWorld.java

build文件自动地引进一系列任务来运行。只需要运行gradle build,你就能看到如下输出,例1-6.
提示:在命令行输入 gradle build

├── build│  ├── classes│  │  └── main│  │       └── java│  │    └─------- simple│  │   └── ------------HelloWorld.class│  ├── dependency-cache│  ├── libs│  │  └── minimal-java-build-file.jar│  ├── reports│  │  └──    tests│  │  ├──------ css3-pie-1.0beta3.htc│  │  ├── ------index.html│  │  ├── ------report.js│  │  └── ------style.css│  ├── test-results├── build.gradle├── run-example.bsh└── src └── main     └── java          └── simple                └── HelloWorld.java

注意到不仅仅Java代码已经被编译了以及它的class文件放置到了一个我们没有配置过的目录中,而且测试报告文件也被生成了,一个使用工程目录名作为文件名的JAR文件也已被构建出来了。这些都是由Gradle的Java插件得到的结果。我们没有做一个决定或写一行配置。毫无疑问,我们可以允许我们简单的Java应用如下所示,例1-7.
例1-7. Running Hello World Java
$ java -cp build/classes/main/ simple.HelloWorld
hello, world
关于Java插件还有很长的故事要讲,这将会用一个单独的章节来讲。

1.6 The Gradle Command Line

在之前的例子中已经展示了Gradle如何从命令行运行,这个主题主要部分还会继续这种形式。Gradle被设计成以一种深的结构层次支持与一流的IDE集成,但是命令行方式终究是个二等的选择。在这些章节中,我们将主要从命令行来工作。

我们将不会覆盖所有可能的命令行选项,但是下面的是你必须要立刻去学习的:
–help or -h
打印出描述所有命令行选项的帮助信息。
–Dproperty = value
定义一个系统属性。这是一个非常有用的机制用来从命令行传递参数给一个构建。例如:
-Dcustom.config=my-config .properties.
–info or -i
设置Gradle日志层级为INFO,这会导致大量的信息打印出来,在默认设置上。
–debug or -d
为构建打开调试日志,包括堆栈跟踪。这会生成大量的输出,但是对检修构建问题非常有用。
–dry -run or -m
评估并运行build文件,但是不会执行任何的任务动作。
–quiet or -q
抑制大多数输出,只显示错误信息。
–gui
启动Gradle GUI。
–stacktrace or -s
发出简短的堆栈跟踪信息当从build抛出异常时。正常情况下,堆栈跟踪日志是抑制输出的,所以当调试一个坏掉的build时这将是一个非常有用的开关。堆栈跟踪是简短的,通过移除与纯内部Groovy方法调用相关的帧。
–full -stacktrace or -s
发出长格式的堆栈跟踪,包含所有的内部Groovy方法调用。这些通常对build开发者不感兴趣。
properties
发出构建项目对象所有的属性。这项目对象是一个代表了当前build的结构和状态的对象。
tasks
发出在当前build文件中的所有可用的任务列表。既然插件也许会引进他们自己的任务,所以这个列表会比你定义的任务更长。
原版电子书下载地址:Build and Test with Gradle.pdf

0 0
原创粉丝点击