说明
这是一个基于 JVM 的富有突破性构建工具。
它为您提供了:
- 一个像 ant 一样,通用的灵活的构建工具
- 一种可切换的,像 maven 一样的基于约定约定优于配置的构建框架
- 强大的多工程构建支持
- 强大的依赖管理(基于 ApacheIvy)
- 对已有的 maven 和 ivy 仓库的全面支持
- 支持传递性依赖管理,而不需要远程仓库或者 pom.xml 或者 ivy 配置文件
- ant 式的任务和构建是 gradle 的第一公民
- 基于 groovy,其 build 脚本使用 groovy dsl 编写
- 具有广泛的领域模型支持你的构建
安装
先决条件
Gradle在所有主要操作系统上运行,只需要安装Java JDK或JRE 7或更高版本。要检查,请运行java -version
环境变量配置
运行 gradle 必须将 GRADLE_HOME/bin 加入到你的 PATH 环境变量中
测试安装
运行如下命令来检查是否安装成功.该命令会显示当前的 JVM 版本和 Gradle 版本。
gradle -v
JVM参数配置
Gradle 运行时的 JVM 参数可以通过 GRADLE_OPTS 或 JAVA_OPTS 来设置.这些参数将会同时生效。 JAVA_OPTS 设置的参数将会同其它 JAVA 应用共享,一个典型的例子是可以在 JAVA_OPTS 中设置代理和 GRADLE_OPTS 设置内存参数。同时这些参数也可以在 gradle 或者 gradlew 脚本文件的开头进行设置
HelloWord
Gradle中的所有内容都基于两个基本概念:Projects和tasks.
每个Gradle构建都由一个或多个项目组成。项目代表什么取决于您使用Gradle做什么。例如,项目可能表示库JAR或Web应用程序。它可能代表由其他项目生成的JAR组装的分发ZIP。项目不一定代表要构建的东西。它可能代表着要做的事情,例如将应用程序部署到登台或生产环境。如果现在看起来有点模糊,请不要担心。Gradle的逐个构建支持为项目的内容添加了更具体的定义。每个项目由一个或多个任务组成。任务代表构建执行的一些原子工作。这可能是编译某些类,创建JAR,生成Javadoc或将一些存档发布到存储库。
使用gradle
命令运行Gradle构建。gradle
命令查找build.gradle
当前目录中调用的文件。我们称这个build.gradle
文件为构建脚本,但严格来说它是一个构建配置脚本。
创建以下名为的构建脚本build.gradle
。
task hello {
doLast {
println 'Hello world!'
}
}
在命令行shell中,移动到包含目录并使用以下命令执行构建脚本gradle -q hello
//--------------------
// 任务依赖
//命令 gradle -q intro
//输出 Hello world!
// I'm Gradle
//--------------------
task hello {
doLast {
println 'Hello world!'
}
}
task intro {
dependsOn hello
doLast {
println "I'm Gradle"
}
}
//--------------------
// 任务依赖-依赖任务在执行任务之后声明
//命令 gradle -q taskX
//输出 taskY
// taskX
//--------------------
task taskX {
dependsOn 'taskY'
doLast {
println 'taskX'
}
}
task taskY {
doLast {
println 'taskY'
}
}
//--------------------
// 动态任务
//命令 gradle -q task1
//输出 I'm task number 1
//--------------------
4.times { counter ->
task "task$counter" {
doLast {
println "I'm task number $counter"
}
}
}
//--------------------
// 操作现有任务-创建任务后,可以通过API访问它们。可以使用它在运行时动态地向任务添加依赖项。Ant不允许这样的事情
//命令 gradle -q task0
//输出
// I'm task number 2
// I'm task number 3
// I'm task number 0
//--------------------
4.times { counter ->
task "task$counter" {
doLast {
println "I'm task number $counter"
}
}
}
task0.dependsOn task2, task3
//--------------------
// 操作现有任务-添加行为
//命令 gradle -q hello
//输出
// Hello Venus
// Hello Earth
// Hello Mars
// Hello Jupiter
//--------------------
task hello {
doLast {
println 'Hello Earth'
}
}
hello.doFirst {
println 'Hello Venus'
}
hello.configure {
doLast {
println 'Hello Mars'
}
}
hello.configure {
doLast {
println 'Hello Jupiter'
}
}
//--------------------
// Groovy DSL快捷方式表示法
//有一种方便的表示法来访问现有任务。每个任务都可以作为构建脚本的属性使用:
//命令 gradle -q hello
//输出
// Hello world!
// Greetings from the hello task.
//--------------------
task hello {
doLast {
println 'Hello world!'
}
}
hello.doLast {
println "Greetings from the $hello.name task."
}
//--------------------
//额外的任务属性
//可以将自己的属性添加到任务中。要添加名为的属性myProperty,请设置ext.myProperty为初始值。从那时起,可以像预定义的任务属性一样读取和设置属性。
//命令 gradle -q printTaskProperties
//输出
// myValue
//
//--------------------
task myTask {
ext.myProperty = "myValue"
}
task printTaskProperties {
doLast {
println myTask.myProperty
}
}
//--------------------
//默认任务
//Gradle允许您定义在未指定其他任务时执行的一个或多个默认任务
//命令 gradle -q
//输出
// Default Cleaning!
// Default Running!
//
//--------------------
defaultTasks 'clean', 'run'
task clean {
doLast {
println 'Default Cleaning!'
}
}
task run {
doLast {
println 'Default Running!'
}
}
task other {
doLast {
println "I'm not a default task!"
}
}
//--------------------
//依赖任务的不同输出
//Gradle具有配置阶段和执行阶段。在配置阶段之后,Gradle知道应该执行的所有任务。Gradle为您提供了一个利用这些信息的钩子。这样的用例是检查释放任务是否是要执行的任务之一。根据此情况,您可以为某些变量分配不同的值。
//在以下示例中,执行distribution和release任务会导致version变量的值不同。
//命令 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
//--------------------
task distribution {
doLast {
println "We build the zip with version=$version"
}
}
task release {
dependsOn 'distribution'
doLast {
println 'We release now'
}
}
gradle.taskGraph.whenReady { taskGraph ->
if (taskGraph.hasTask(":release")) {
version = '1.0'
} else {
version = '1.0-SNAPSHOT'
}
}
//--------------------
//构建脚本的外部依赖项
//如果构建脚本需要使用外部库,则可以将它们添加到构建脚本本身的脚本类路径中。您可以使用该buildscript()方法执行此操作,并传入一个声明构建脚本类路径的块。
//对于多项目构建,使用项目buildscript()方法声明的依赖项可用于其所有子项目的构建脚本
//命令 gradle -q encode
//输出 aGVsbG8gd29ybGQK
//--------------------
import org.apache.commons.codec.binary.Base64
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath group: 'commons-codec', name: 'commons-codec', version: '1.2'
}
}
task encode {
doLast {
def byte[] encodedString = new Base64().encode('hello world\n'.getBytes())
println new String(encodedString)
}
}
//--------------------
//使用方法
//Gradle可以扩展您如何组织构建逻辑。为上面的示例组织构建逻辑的第一个级别是提取方法。
//对于多项目构建,使用项目buildscript()方法声明的依赖项可用于其所有子项目的构建脚本
//命令 gradle -q loadfile
// I'm fond of build.gradle
// I'm fond of build2.gradle
// I'm fond of gradle.properties
// I'm fond of java_pid39256.hprof
//--------------------
task checksum {
doLast {
fileList('../../').each { File file ->
ant.checksum(file: file, property: "cs_$file.name")
println "$file.name Checksum: ${ant.properties["cs_$file.name"]}"
}
}
}
task loadfile {
doLast {
fileList('../Downloads').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()
}