1 Groovy


Groovy 是没有类型的 Java 代码 ,语法更简洁。形式有点类似脚本语言。被gradle用于构建脚本的语言

1.1 特殊类型
1、范围
范围 是一系列的值。

比如 “0..4” 表明包括 整数 0、1、2、3、4。Groovy 还支持排除范围,“0..<4” 表示 0、1、2、3。还能够创建字符范围:“a..e” 相当于 a、b、c、d、e。“a..<e” 包括小于 e 的全部值。

def range = 0..4

2、集合
def coll = ["Groovy", "Java", "Ruby"]

3、映射
def hash = [name:"Andy", "VPN-#":45]

1.2 闭包Closure
闭包是可运行的代码块。

它们不须要名称。能够在定义之后运行。


1、 闭包的格式
  1. def xxx = {paramters -> code}  //或者
  2. def xxx = {无參数,纯code}  这样的case不须要->符号

2、 闭包的特点
闭包在Groovy中大量使用,比方非常多类都定义了一些函数,这些函数最后一个參数都是一个闭包。


Groovy中。当函数的最后一个參数是闭包的话,能够省略圆括号。比方  
事实上标识doLast为一个函数,函数的最后一个參数为闭包
  1. doLast({
  2. println'Hello world!'
  3. })
有了圆括号。你会知道 doLast仅仅是把一个Closure对象传了进去。非常明显。它不代表这段脚本解析到doLast的时候就会调用println 'Hello world!' 。
可是把圆括号去掉后。就感觉好像println 'Hello world!'马上就会被调用一样!

举例:闭包用于迭代
def acoll = ["Groovy", "Java", "Ruby"]

acoll.each{
println it
}
闭包中的 it 变量是一个keyword,指向被调用的外部集合的每一个值
— 它是默认值,能够用传递给闭包的參数覆盖它。


1.3 groovy脚本的实质
既然是基于Java的,Groovy会先把xxx.groovy中的内容转换成一个Java类。比方:
test.groovy的代码是:
  1. println 'Groovy world!'

Groovy把它转换成这种Java类:

运行 groovyc-d classes test.groovy

groovyc是groovy的编译命令,-d classes用于将编译得到的class文件复制到classes目录下

2 Gradle


Gradle是一种依赖管理工具,基于Groovy语言。面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言。

用于自己主动化构建、測试、公布打包。


2.1 基本组件
Gradle是一个框架。它定义一套自己的游戏规则。我们要玩转Gradle。必需要遵守它设计的规则。以下我们来讲讲Gradle的基本组件:
Gradle中,每个待编译的project都叫一个Project。

每个Project在构建的时候都包括一系列的Task。

比方一个Android APK的编译可能包括:Java源代码编译Task、资源编译Task、JNI编译Task、lint检查Task、打包生成APK的Task、签名Task等。

1.  gradle projects查看工程信息

到眼下为止,我们了解了Gradle什么呢?

l 每个Project都必须设置一个build.gradle文件。至于其内容。我们留到后面再说。

l 对于multi-projects build。须要在根文件夹下也放一个build.gradle,和一个settings.gradle。

l 一个Project是由若干tasks来组成的,当gradlexxx的时候,实际上是要求gradle运行xxx任务。

这个任务就能完毕详细的工作。


2.  gradle tasks查看任务信息

gradleproject-path:tasks 即可。注意,project-path是文件夹名。后面必须跟冒号。

对于Multi-project。在根文件夹中,须要指定你想看哪个poject的任务。

只是你要是已经cd到某个Project的文件夹了,则不需指定Project-path。

2.2 gradle build的生命周期
  • l Gradle有一个初始化流程,这个时候settings.gradle会运行。
  • l 在配置阶段,每一个Project都会被解析。其内部的任务也会被加入到一个有向图里,用于解决运行过程中的依赖关系。
  • l 然后才是运行阶段。

    你在gradle xxx中指定什么任务。gradle就会将这个xxx任务链上的所有任务所有按依赖顺序运行一遍!

(1)生命周期

eg:Single project build example

settings.gradle

println 'This is executed during the initialization phase.'

build.gradle

println 'This is executed during the configuration phase.'

task configured {
println 'This is also executed during the configuration phase.'
} task test << {
println 'This is executed during the execution phase.'
} task testBoth {
doFirst {
println 'This is executed first during the execution phase.'
}
doLast {
println 'This is executed last during the execution phase.'
}
println 'This is executed during the configuration phase as well.'
}


(2)setting.gradle中多project配置
当中setting.gradle在多project的配置中。用于声明包括的project及其层级关系(平坦和层级结构的project都支持)
include 'project1', 'project2:child', 'project3:child1'
includeFlat 'project3', 'project4'

(3)依据生命周期定制task

eg:Logging of start and end of each task execution

build.gradle

task ok

task broken(dependsOn: ok) << {
thrownew RuntimeException('broken')
} gradle.taskGraph.beforeTask { Task task ->
println "executing $task ..."
} gradle.taskGraph.afterTask { Task task, TaskState state ->
if (state.failure) {
println "FAILED"
}
else {
println "done"
}
}


3 Gradle用途


(1)依赖管理
我们的project可能会用到其它的库(本地、maven或者ivy)
eg:Declaring dependencies
本地project依赖
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile project(':bugrpt')
}

远程库依赖

apply plugin: 'java'

repositories {
mavenCentral()
} dependencies {
compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
testCompile group: 'junit', name: 'junit', version: '4.+'
}

标识project须要hibernate-core一起编译,project test须要junit的编译,第二种写法group:name:version

dependencies {
compile 'org.hibernate:hibernate-core:3.6.7.Final'
}

像这些外部的库,gradle是通过repository来找到的


eg:Usage of a remote Maven repository

build.gradle

repositories {
maven {
url "http://repo.mycompany.com/maven2"
}
}

eg:Usage of a local Ivy directory

build.gradle

repositories {
ivy {
// URL can refer to a local directory
url "../local-repo"
}
}
(2)版本号公布

eg:公布project

uploadArchives {
repositories {
ivy {
credentials {
username "username"
password "pw"
}
url "http://repo.mycompany.com"
}
}
}

(3) 差异管理
比方app生成不同版本号(免费。收费)。适配特殊机型,多渠道等须要发多个包。终于能编译出的apk的数量是由productflavor与BuildType决定的,BuildType默认有debug和release两种
eg:免费与收费设置不同包名
 productFlavors {
        pay {
            applicationId "me.ghui.gradledemo.pay"
        }
        free {}
    }

eg:buildTypes 相应的不同版本号
android {
    buildTypes {

        debug {

            applicationIdSuffix ".debug"

        }


        jnidebug {

            initWith(buildTypes.debug)

            packageNameSuffix ".jnidebug"

            jniDebuggable true

        }

    }

}
对于每一种buildTypes 会创建对应的ssemble<BuildTypeName>任务,比方debug会自己主动创建assembleDebug任务


eg:多渠道打包


4 gradle wrapper

gradlew通过包裹了gradle,然后通过配置中url下载。存储到用户文件夹 $USER_HOME/.gradle/wrapper/dists.

 启动图形界面

gradle --gui





附录 gradle脚本基础
1 project和task
task表示构建的一次原子操作,包括编译类、创建jar包、公布到repository、生成javadoc等,而project通常包括多个task
task hello {
doLast {
println 'Hello world!'
}
}

这个脚本定义了一个叫做hello的task,而且加入了一个action,这个action实际上是由groovy语言编写的闭包。更简洁的写法

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

> gradle -q hello

Hello world!

2 task依赖

project('projectA') {
task taskX(dependsOn: ':projectB:taskY') << {
println 'taskX'
}
} project('projectB') {
task taskY << {
println 'taskY'
}
}

3 能够动态创建task,并通过api操作task
4.times { counter ->
task "task$counter" << {
println "I'm task number $counter"
}
}
task0.dependsOn task2, task3
4 task能够定义属性
task myTask {
ext.myProperty = "myValue"
} task printTaskProperties << {
println myTask.myProperty
}

5 设置默认

defaultTasks 'clean', 'run'

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

6 能够加入HOOK

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'
}
}


7 定位task
1)使用task的名字
println hello.name
2)使用tasks collection
println tasks.hello.name
3)使用project:task路径定位
tasks.getByPath(':projectA:hello').path

8 配置task

Configuring a task - with closure


task copy(type: Copy) {
description 'Copies the resource directory to the target directory.'
from 'resources'
into 'target'
include('**/*.txt', '**/*.xml', '**/*.properties')
}

參考:

AndroidStudio下gradle的入门介绍与使用的更多相关文章

  1. [Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上)

    最近在使用Python爬取网页内容时,总是遇到JS临时加载.动态获取网页信息的困难.例如爬取CSDN下载资源评论.搜狐图片中的“原图”等,此时尝试学习Phantomjs和CasperJS来解决这个问题 ...

  2. Android CoordinatorLayout 入门介绍

    Android CoordinatorLayout 入门介绍 CoordinatorLayout View 知道如何表现 在 2015 年的 I/O 开发者大会上,Google 介绍了一个新的 And ...

  3. 初识Hadoop入门介绍

    初识hadoop入门介绍 Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身. < ...

  4. Nginx - Windows下Nginx初入门

    公司刚使用nginx,预先学习下.鉴于机器没有Linux环境,在Windows熟悉下. 下载 目前(2015-07-11),nginx的稳定版本是1.8.0,在官网下载先,windows版的nginx ...

  5. [Python爬虫] scrapy爬虫系列 <一>.安装及入门介绍

    前面介绍了很多Selenium基于自动测试的Python爬虫程序,主要利用它的xpath语句,通过分析网页DOM树结构进行爬取内容,同时可以结合Phantomjs模拟浏览器进行鼠标或键盘操作.但是,更 ...

  6. Gradle学习系列之一——Gradle快速入门

    这是一个关于Gradle的学习系列,其中包含以下文章: Gradle快速入门 创建Task的多种方法 读懂Gradle语法 增量式构建 自定义Property 使用java Plugin 依赖管理 构 ...

  7. eclipse下gradle配置

    eclipse下gradle配置 这可真麻烦啊,一个项目把java的东西学习完了!这不,刚弄完maven又来了个gradle. http://gradle.org/gradle-download 1. ...

  8. Windows下FFmpeg高速入门

    本系列文章导航 Windows下FFmpeg高速入门 ffmpeg參数解释 mencoder和ffmpeg參数具体解释(Java处理视频) Java 生成视频缩略图(ffmpeg) 使用ffmpeg进 ...

  9. Gradle学习系列之一——Gradle快速入门(转)

    这是一个关于Gradle的学习系列,其中包含以下文章: Gradle快速入门 创建Task的多种方法 读懂Gradle语法 增量式构建 自定义Property 使用java Plugin 依赖管理 构 ...

随机推荐

  1. Python-数据类型-转摘

    1.数字 2 是一个整数的例子.长整数 不过是大一些的整数.3.23和52.3E-4是浮点数的例子.E标记表示10的幂.在这里,52.3E-4表示52.3 * 10-4.(-5+4j)和(2.3-4. ...

  2. stack 的入门

    #include "iostream"#include "stack" using namespace std; void main12(){ stack &l ...

  3. 建立LINUX服务器

    建立LINUX服务器:一. 下载UltraISO工具并用该工具制作LINUX启动U盘,制作步骤如下:http://www.linuxidc.com/Linux/2012-11/74695.htm [^ ...

  4. salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见

    项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...

  5. CSS和文档

    1. 块级元素: p,div,ul,ol,h1,h2 . . . h6等.块级元素独占一行,旁边不能有其他元素. 2. 行内元素:span,a,strong,em等. display属性可以使块级元素 ...

  6. java继承系列之添加一个LinkLable类

    import java.awt.*; import javax.swing.*; import javax.swing.JFrame; import java.awt.event.WindowList ...

  7. Win10下Docker学习(1)安装

    Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制, ...

  8. JDBC之代码优化

    上一次我们是先实现了JDBC对数据库的增删查改操作,然后在增加新信息过程中发现了新的问题,即当某一操作失败,为了维护数据库的一致性,我们需要回滚事务.在其中我们了解了事务的工作原理及相关代码的使用. ...

  9. [转载] Java集合框架之小结

    转载自http://jiangzhengjun.iteye.com/blog/553191 1.Java容器类库的简化图,下面是集合类库更加完备的图.包括抽象类和遗留构件(不包括Queue的实现): ...

  10. JavaScript学习笔记(六)——Map、Set与iterable

    在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...