Gradle详解-脚本基础知识

来源:互联网 发布:薪酬优化 密件工资单 编辑:程序博客网 时间:2024/05/01 15:06

Gradle官网

用户指南-UserGuide

Chapter 14. Build Script Basics 构建脚本基础

Chapter 16. Writing Build Scripts 写脚本

简介:
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。 之所以选择Groovy来构建脚本,是因为Groovy可以和java很好的结合编程,因此对于java开发人员来说,几乎不需要学习成本。

面向Java应用为主。当前其支持的语言限于Java、Groovy和Scala,计划未来将支持更多的语言。

Gradle 特性
1. 一种非常灵活通用的构建工具像Ant一样。
2. 一种可切换的,像maven一样的基于约定的构建框架,却又从不锁住你(约定优于配置)
3. 强大的支持多工程的构建
4. 强大的依赖管理(基于Apache Ivy),提供最大的便利去构建你的工程
5. 全力支持已有的Maven或者Ivy仓库基础建设
6. 支持传递性依赖管理,在不需要远程仓库和pom.xml和ivy配置文件的前提下
7. Ant tasks and builds as first class citizens
8. 基于groovy脚本构建,其build脚本使用groovy语言编写
9. 具有广泛的领域模型支持你的构建

特性详解https://docs.gradle.org/current/userguide/overview.html

安装要求
需要jdk6或者更高版本。记得配环境变量(配置到bin目录)。
Gradle下载地址 https://gradle.org/post-download-gradle/
Gradle下载地址需要填写自己的邮箱

安装Gradle
Installing Gradle

Gradle目录结构:
. The Gradle binaries.
. The user guide (HTML and PDF).
. The DSL reference guide.
. The API documentation (Javadoc and Groovydoc).
. Extensive samples, including the examples referenced in the user guide, along with some complete and more complex builds you can use as a starting point for your own build.
. The binary sources. This is for reference only. If you want to build Gradle you need to download the source distribution or checkout the sources from the source repository. See the Gradle web site for details.

这里写图片描述

这里写图片描述

=====================================

Chapter 14. Build Script Basics 构建脚本基础

14.1 所有的Gradle依托于两个概念:projects和tasks

  Gradle 是有一个或者多个projects组成
  每一个project有一个或者多个tasks组成

14.2 伟大的HelloWorld

  在任意目录下D:\GradleTest建立build.gradle文件并且写入以下内容。

task hello {    doLast {        println 'Hello world!'    }}

 执行gradle -q hello命令 或者是 gradle hello

D:\GradleTest>gradle -q helloHello world!D:\GradleTest>=======================or==========================D:\GradleTest>gradle hello:helloHello world!BUILD SUCCESSFULTotal time: 1.391 secsD:\GradleTest>

14.3. A shortcut task definition  简介定义

   当你使用了<<就不要再使用doLast,否则task出错
   << 操作时是doLast 的别名
   并且以后就使用这种简易风格

task hello << {    println 'Hello world!'}

错误信息:

D:\GradleTest>gradle -q helloFAILURE: Build failed with an exception.* Where:Build file 'D:\GradleTest\build.gradle' line: 2* What went wrong:Execution failed for task ':hello'.> Cannot call Task.doLast(Closure) on task ':hello' after task has started execution. Check the configuration of task ':hello' as you may have misused '<<' at task declaration.* Try:Run with --stacktrace option to get the stack trace. Run with --info or --debugoption to get more log output.

14.4. Build scripts are code 编写脚本代码块

task upper << { // 打印字符串,字符串转为大写    String someString = 'mY_nAmE'    println "Original: " + someString     println "Upper case: " + someString.toUpperCase()task count << { // for循环  查Groovy的循环方式,你会大吃一惊    10.times { print "$it " }    //  n.times 函数,表示循环n次,循环变量it从0开始到n结束}}

 执行命令和结果展示

D:\GradleTest>gradle -q count0 1 2 3 4 5 6 7 8 9D:\GradleTest>gradle -q upperOriginal: mY_nAmEUpper case: MY_NAMED:\GradleTest>

14.5. Task dependencies 任务的依赖

 eg1:

task hello << {    println 'Hello world!'}task intro(dependsOn: hello) << { // intro 依赖hello    println "I'm Gradle"}表示:intro任务依赖于hello任务,依赖任务先执行

eg2:

// 依赖的任务只需要存在,不分先后顺序,也就是懒依赖 Lazy dependsOntask taskX(dependsOn: 'taskY') << {    println 'taskX'}task taskY << {    println 'taskY'}

懒依赖 Lazy dependsOn 对于多项目的构建非常重要

14.6. Dynamic tasks 动态的任务

4.times { counter ->    task "task$counter" << {        println "I'm task number $counter"    }}// 构建了四个任务  task0,task1,task2,task3执行任务命令:gradle -q task1    gradle -q task2

14.7. Manipulating existing tasks

操作已存在的任务或者给已存在的任务添加行为 doFirst doLast(<<)

4.times { counter ->    task "task$counter" << {        println "I'm task number $counter"    }}// 使用已存在的任务  死循环嵌套不允许存在task0.dependsOn task2, task3task3.dependsOn task1

执行task task0结果:

D:\GradleTest>gradle -q task0I'm task number 2I'm task number 3I'm task number 0D:\GradleTest>

添加行为:doFirst 和 doLast 。这两个可以调用多次
doFirst:任务执行前执行,从最后一个向前执行
doLast:任务执行后执行,从第一个向后执行

task hello << {  //  故意将doFirst和doLast位置打乱    println 'Hello Earth'}hello.doLast {    println 'Hello Mars'}hello.doFirst {    println 'first more times use22'}hello.doFirst {    println 'Hello Venus4444444444'}hello << {    println 'Hello Jupiter'}hello.doFirst {    println 'Hello Venus33333'}hello.doLast {    println 'Hello Mars111111'}

结果:

D:\GradleTest>gradle hello:helloHello Venus33333Hello Venus4444444444first more times use22Hello EarthHello MarsHello JupiterHello Mars111111

14.8. Shortcut notations 快捷符号  $ 符号

这使得代码可读性非常好,尤其是使用插件提供的任务时,就好比编译任务

task hello << {    println 'Hello world!'}hello.doLast {    println "Greetings from the $hello.name task."}

查看一个task的信息的命令 :gradle help –task task
eg:gradle help –task hello

提个问题 : $都可以操作task的哪些属性
已知:

 $hello.description $hello.group $hello.path $hello.name

14.9. Extra task properties 扩展属性 or 自定义属性

设置自定义属性:ext.自定义属性名
调用自定义属性: task.自定义属性名

task myTask {    ext.myProperty = "myValue"}task printTaskProperties << {    println myTask.myProperty}设置自定义属性:ext.自定义属性名调用自定义属性: task.自定义属性名

结果:

D:\GradleTest>gradle -q printTaskPropertiesmyValue

14.10. Using Ant Tasks 在Gradle中使用ant 任务

Gradle通过Groovy很好的集成了ant task,Groovy 中附带有非常出色的AntBuilder,因此在使用ant tasks时,要比ant自带的build.xml更方便更强大。
eg:
在antLoadfileResources文件夹中,随便建立两个文件,输入内容

task loadfile << {//../antLoadfileResources 相对于当前目录(build.gradle文件所在目录)    def files = file('../antLoadfileResources').listFiles().sort()    files.each { File file ->        if (file.isFile()) {            ant.loadfile(srcFile: file, property: file.name)            println " *** $file.name ***" // 代表文件名            println "${ant.properties[file.name]}" // 代表文件内容        }    }}

结果:

D:\GradleTest>gradle -q loadfile *** build.properties ***文件1中的内容 *** build.xml ***文件2中的内容

14.11. Using methods 使用方法

在build.gradle中定义方法并且在task中调用

task checksum << {    fileList('../antLoadfileResources').each {File file ->        ant.checksum(file: file, property: "cs_$file.name")        println "$file.name Checksum: ${ant.properties["cs_$file.name"]}"    }}task loadfile << { // 调用fileList方法    fileList('../antLoadfileResources').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()}

结果:

D:\GradleTest>gradle -q loadfileI'm fond of build.propertiesI'm fond of build.xml

14.12. Default tasks 默认task

在build.gradle根目录中,当你执行 gradle -q 或者 gradle 时调用的方法。

1,可以定义一个或者多个默认task。
2,每个子项目都可以有自己的默认task,子项目没有默
  task,就调用父项目的默认task(如果父项目中定义了)

defaultTasks 'clean', 'run'task clean << {    println 'Default Cleaning!'}task run << {    println 'Default Running!'}task other << {    println "I'm not a default task!"}

结果: 注意是在build.gradle所在的根目录执行才会执行默认task
D:\GradleTest\project1 > gradle -q

D:\GradleTest\project1>gradle -qDefault Cleaning!Default Running!

14.13. Configure by DAG DAG 配置

Gradle 有配置阶段和执行阶段,配置阶段结束后,Gradle才知道它要执行的所有任务。Gradle通过钩子函数使用这些信息。配置阶段就可以通过不同的判断,赋予不同变量的值。

eg:发布任务和分发任务中 version的值不同

// 分发任务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'    }}

结果:

D:\GradleTest\project1>gradle -q releaseWe build the zip with version=1.0We release nowD:\GradleTest\project1>gradle -q distributionWe build the zip with version=1.0-SNAPSHOTD:\GradleTest\project1>
0 0
原创粉丝点击