Gradle脚本基础全攻略(1),2024大厂Android面试真题集锦

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.’

}

运行构建结果:

gradle test testBoth

This is executed during the initialization phase.

This is executed during the configuration phase.

This is also executed during the configuration phase.

This is executed during the configuration phase as well.

:test

This is executed during the execution phase.

:testBoth

This is executed first during the execution phase.

This is executed last during the execution phase.

BUILD SUCCESSFUL

Total time: 1 secs

Gradle多项目构建:

多项目构建总是需要指定一个树根,树中的每一个节点代表一个项目,每一个Project对象都指定有一个表示在树中位置的路径;在设置文件中我们还可以使用一套方法来自定义构建项目树。

//分层布局的多项目构建settings.gradle文件

include ‘project1’, ‘project2:child’, ‘project3:child1’

上面例子中把project的路径作为了include方法的参数,譬如上面的’project3:child1’参数就指定了物理路径的project3/child1(project3/child1是相对于多项目根路径的相对路径),这也同时意味着会创建’project3’和’project3:child1’两个project。

//平面布局的多项目构建settings.gradle文件

includeFlat ‘project3’, ‘project4’

上面例子中includeFlat方法接受目录名作为参数,但是特别注意,这些项目目录必须是根目录的兄弟目录。

当然了,设置文件中创建的多项目树其实是由项目描述符来描述的,我们可以在设置文件中随时修改这些描述符。如下:

//settings.gradle

rootProject.name = ‘main’

project(‘:projectA’).projectDir = new File(settingsDir, ‘…/my-project-a’)

project(‘:projectA’).buildFileName = ‘projectA.gradle’

可以看见,如上例子通过描述符更改名称和项目目录,并且建立了一个项目的文件。

Gradle构建初始化Initialization:

在初始化阶段如果我们在根路径下直接指明settings.gradle文件和相关配置则构建初始化就会直接按照我们的设置去构建项目,如果我们没指明settings.gradle文件则Gradle会以一定的规则去寻找settings.gradle文件,然后依据寻找结果的不同去决定如何构建项目。

【工匠若水 http://blog.csdn.net/yanbober 转载请注明出处。点我开始Android技术交流

3 Gradle构建基础

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

通过上一章可以知道,每一个Gradle构建都是由一个或多个project构成,每一个project都是由一个或多个tasks构成,每个task的实质其实是一些更加细化的构建(譬如编译class、创建jar文件等)。

任务task基础:

如下例子我们先来直观感受一下task的概念,具体细节后面会探讨:

//创建一个名为build.gradle的文件

task hello {

doLast {

println ‘Hello world!’

}

}

//这是快捷写法,用<<替换doLast,后面解释

task hl << {

println ‘Hello world!’

}

//创建upper的task,使用Groovy语言编写

task upper << {

String someString = ‘mY_nAmE’

println "Original: " + someString

println "Upper case: " + someString.toUpperCase()

}

通过如下命令运行构建上面名为hello的task,具体如下:

xxx@XXX:~/$ gradle hello

:hello

Hello world!

BUILD SUCCESSFUL

Total time: 1.037 secs

可以看见,gradle命令会在当前目录中查找一个叫build.gradle的构建脚本文件,这个构建脚本定义了一个叫做hello的独立task,并且添加了一个action,我们执行了这个task就得到了想要的结果。

在这里再多嘴一句,我们看下task有无action的区别,如下:

//有Action的task

task actionTask << {

println ‘I am actionTask’

}

//无Action的task

task noActionTask {

println ‘I am noActionTask’

}

一定要记住,在上面这个例子中如果task没有加<<则这个任务在脚本初始化initialization阶段(即无论执行啥task都被执行,具体参见上一章的第一个例子)被执行,如果加了<<则在gradle actionTask后才执行。因为没有加<<则闭包在task函数返回前会执行,而加了<<则变成调用actionTask.doLast(),所以会等到gradle actionTask时执行。

任务task依赖:

我们通过上面task基础感受的例子可以发现,一个build.gradle文件中定义多个task互相没有关系,决定执行的是我们gradle命令后面跟的task名字;那我们要是让他们之间有依赖关系咋办呢?如下:

task taskX(dependsOn: ‘taskY’) << {

println ‘taskX’

}

task taskY << {

println ‘taskY’

}

运行结果如下:

xxx@XXX:~/$ gradle taskX

:taskY

taskY

:taskX

taskX

BUILD SUCCESSFUL

Total time: 1.039 secs

动态任务task:

我们还可以在Gradle中使用Groovy来创建动态task,如下:

4.times { counter ->

task “task$counter” << {

println “I’m task number $counter”

}

}

运行结果如下:

xxx@XXX:~/$ gradle task1

:task1

I’m task number 1

BUILD SUCCESSFUL

Total time: 1.397 secs

使用已存在任务task:

我们除过在上面定义任务task时指明依赖以外还可以通过API为任务加入一个依赖,如下:

4.times { counter ->

task “task$counter” << {

println “I’m task number $counter”

}

}

task0.dependsOn task2, task3

运行结果如下:

xxx@XXX:~/$ gradle task0

:task0

I’m task number 2

I’m task number 3

I’m task num

  • 21
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值