Gradle基础知识(1)

安装Gradle

  1. 确保安装你的电脑了Java7或以上版本
  2. 在这里下载最新的Gradle distribution
  3. 创建一个文件夹,把下载的压缩包解压进去(以C:\Gradle为例),然后进入文件夹中的bin目录,复制路径(C:\Gradle\gradle-4.3.1\bin),把路径加入到系统环境变量的Path
  4. 命令行输入gradle -v,显示Gradle版本即安装完成

注:官方指南

Groovy基础知识

Groovy简介

Groovy是一种基于JVM的敏捷开发语言,他可以和Java进行混写,同时Groovy在配置信息上又比Java要灵活,他具有闭包和动态语言中的其他特性。

正题

在Groovy中,你可以这样打印一句话,跟Java很像有木有

println "Hello Groovy!"

Groovy与Java混写,这样是没问题的

//Java
class JavaGreeter {
    public void sayHello() {
        System.out.println("Hello Java!");
    }
}
//Groovy
def greeter = new JavaGreeter()
greeter.sayHello()

Groovy只在运行时检查类型,也就是说我们不需要申明变量的类型,并且可以中途改变类型

def foo = 6.5//这里foo是一个浮点数
foo = "a string"//这里foo变为一个字符串

Groovy中字符串的拼接和Kotlin中的很像

println "foo has value: $foo"//$后加变量名
println "Let's do some math. 5 + 6 = ${5 + 6}"//${表达式}

Groovy的函数不需要申明参数类型,也不需要写return,写在函数里的最后一个表达式就是返回值

def doubleIt(n) {
   n + n 
  // return n + n 也可以
}

Groovy中的函数调用有点意思,无参函数的调用必须加括号,有参函数调用可以不加括号,参数之间用逗号隔开

def noArgs() {
    println "Called the no args function"
}
def oneArg(x) {
    println "Called the 1 arg function with $x"
    x
}
def twoArgs(x, y) {
    println "Called the 2 arg function with $x and $y"
    x + y
}


oneArg 500 //ok,没问题
twoArgs 200, 300//ok,也没问题
noArgs //。。。有问题
noArgs() //没问题

twoArgs oneArg 500, 200 // 这样的嵌套是有问题的,groovy不能识别你的参数到底是给谁的
twoArgs oneArg(500), 200 // 这样就很确定了,500是给oneArg,返回值和200给twoArgs

Groovy的闭包,感觉和Kotlin的λ表达式基本相同,可以作为一个变量,闭包的调用和函数是一样的

def noArgs = {
    println "Hello from a closure"
    println "The value of foo is $foo"
}//不接受参数的闭包

def oneArg = { x -> x + x}//接受一个参数的闭包

noArgs()
twoArgs 200, 300

Groovy的闭包可以通过委托(delegate)来把自己变成一个类的函数

//定义一个类
class A {
    String b = "123"
    def c(){println "321"}
}
//生成该类对象
def myA = new A()
//定义一个闭包,在里面操作A类中的变量和函数
def d = {
    b = "1234"
    c()
}
//这样调用是报错的,他不知道去哪里找到b和c()
d()
//把A类的实例赋值给闭包的委托,这样闭包就可以操作A类的东西了
d.delegate = myA
d() // ok

在Groovy中用闭包来遍历列表什么的很方便,和kotlin一样

//定义一个列表
def myList = ["Gradle", "Groovy", "Android"]
//定义一个接受一个参数的闭包
def printItem = {item -> println "List item: $item"}
//List的each函数接收一个参数的闭包,这样就把所有item打印出来了
myList.each(printItem)
/*
当然如果韩式嫌麻烦的话可以省去定义闭包的部分
这种方式下,如果函数接受的闭包是只有一个参数的,那么他默认为it
*/
myList.each{println "List item: $it"}

Gradle Now

怎么运行Gradle代码

  1. 首先要有一个编写Gradle的地方,只要能打字,什么卵都是可以的,我建议使用Sublime
  2. 然后创建一个build.gradle文件,在里面写代码,保存
  3. 命令行或者powerShell到当前目录下,输入gradle的命令就ok,比如要看看build.gradle里面有什么task就输入gradle tasks,要执行里面的task就输入 gradle [taskName]

Task

task就是一个个的任务,可以单独的执行,如下声明一个task

task("myTask1")//ok
task "myTask2"//ok
task myTask3//ok
//给任务加上描述
myTask3.description = "This is what's shown in the task list"
//给任务分组
myTask3.group = "Some group"
//任务最后会执行的闭包
myTask3.doLast {println "Do this last"}
//任务一开始就执行的闭包
myTask3.doFirst {println "Do this first"}
/*
把这些配置放到闭包configureClosure中也是ok的
*/
task myTask4 {
    description "Here's a task with a configuration block"
    group "Some group"
    doLast {
        println "Here's the action"
    }
}

这样也是可以的,括号里接受一个Map来描述一些配置信息

task myTask5(description: "Another description") {
    doLast {
        println "Doing something"
    }
}

能以Map的方式写在括号里的配置还有这些

这里写图片描述

命令行输入gradle tasks看看,本来是会显示很多东西的,但是这里只把和上面代码有关的贴出来

snipaste_20171116_120424

上面明明写了好多个task,但是他只显示了Some group分组下的两个task,其他不见了,仔细看他说To see all tasks and more detail, run gradle tasks --all,试试吧

snipaste_20171116_125645

好的我们定义的task全都出来了,有分组的都在同一分组下,没分组的在Other tasks下,并且有描述的都可以看见描述。现在这些task都是可以执行的,试试gradle myTask3,输出如下

Task :myTask3
Do this first
Do this last

Task Dependencies

dependsOn

以下面的代码为例,表示b依赖于a

执行b的结果:

a

b

执行a的结果:

a

task a {
    doLast {
        println "a"
    }
}

task b {
    dependsOn "a"
    doLast {
        println "b"
    }
}
finalizedBy

以下面的代码为例,表示a要以b结尾

执行a的结果是:

a

b

执行b的结果是:

b

task a {
    finalizedBy "b"
    doLast{
        println "a"
    }
}

task b {
    doLast {
        println "b"
    }
}
shouldRunAfter

以下面的代码为例,表示如果a和b都要执行,那么b应该在a的后面执行

执行a的结果是:

a

执行b的结果是:

b

a和b一起执行的结果是:

注:多个任务执行命令如右 gradle b a

a

b

task a {
    doLast {
        println "a"
    }
}

task b {
    shouldRunAfter "a"
    doLast{
        println "b"
    }
}
mustRunAfter

个人觉得mustRunAfter和shouldRunAfter的效果是一样的

执行a的结果是:

a

执行b的结果是:

b

a和b一起执行的结果是:

a

b

task a {
    doLast {
        println "a"
    }
}

task b {
    mustRunAfter "a"
    doLast{
        println "b"
    }
}

TaskType

如果实现每一个功能都要从零开始写就太麻烦了,Gradle已经为我们准备好了许多有用的Task,在这个网址左边的导航栏可以找到,下面介绍怎么使用这些TaskType,以复制文件为例Copy,官网上的例子

//在括号里写上要使用的TaskType
task copyDocs(type: Copy) {
  //从这个路径
    from 'src/main/doc'
  //到这个路径
    into 'build/target/doc'
}

上面就是简单的使用了Copy这个TaskType来复制文件,还有很多高级玩法,不知道怎么玩的话就看看对应TaskType的文档说明,比如Copy

自定义TaskType

原来的TaskType不够玩了?那就扩展呗,其实就是写一个继承DefaultTask的类,下面做最简单的示例

执行gradle hello

Me

class MyTask extends DefaultTask {
  //类里面随便写
  String who
  /*
  @TaskAction表示这个Task被执行的时候会做的事
  */
    @TaskAction
    void doAction() {
        println "Hello $who"
    }
}

task hello(type:MyTask){
  who 'Me' //给who属性赋值
}

IncrementalBuilds

gradle有个棒棒的地方,就是他会智能的进行构造,假设就是简单的把某个文件Copy到某个地方,你运行这个task,文件复制好了,你再运行一次,她不会再去执行一次复制操作,只要你的输入输出没变,那么他就不会重复的执行,这在构造项目的时候就很有用了,也许你只改了一个字母,那他就不需要把所有文件都重新走一遍。

参数化构建

假设有下面这样一个Task,执行是肯定会报错的,找不到yourName

task hello{
    println "hello $yourName"
}

向task传递yourName参数有三种方式,优先级依次递增

  1. 同目录下gradle.properties文件中声明

    yourName = 'chengge'
    

  2. 命令行输入

    gradle -PyourName='weige' hello

  3. build.gradle中申明

ext {
    yourName = "jige"
}

如果上面三种方法一起用上,那么效果是

jige

好了好了,水了一天,先到这里了,很多不充分的地方大家提出来呀,不对的地方大家指正呀!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 这篇文章讲给大家带来gradle打包系列中的高级用法-自己动手编写gradle插件。我们平常在做安卓开发时,都会在...
    呆萌狗和求疵喵阅读 15,974评论 22 80
  • 导语: 随着技术的发展,不管是前端开发、服务端开发或者是移动端开发(移动也是前端的一个分支)中都会用到自动化构建工...
    伊始雨深阅读 3,020评论 0 4
  • Gradle对于很多开发者来说有一种既熟悉又陌生的感觉,他是离我们那么近,以至于我每天做项目都需要他,但是他又是离...
    阿_希爸阅读 9,569评论 10 199
  • Groovy :是一种动态语言。 1:这种语言比较有特点,它和 Java 一样,也运行于 Java 虚拟机中。简单...
    PeytonWu阅读 1,545评论 0 1