Projects和Tasks

简介:

在gradle中,所有的事物都基于两个概念:projectstasks
每一个gradle的构建系统都由一个或多以project组成。例如一个project可以表示一个jar包或者一个web app的构建。又或者是一个android应用的编译打包。
每一个project都由一个或若干个task组成。一个task包含了一些构建过程中的原子不可拆分的片段。一个task可能用来编译一些java的类文件,生成Javadoc,又或者部署你的代码到管理仓库。

在上一讲中我们打印了helloworld,那么这次我们就使用task来打印helloworld:

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

接着在命令行输入gradle -q hello,其输出如下:

Hello world!

执行这行命令,到底发生了什么?首先这个脚本定义了一个task叫做hello,让后向其添加一个action。当你执行gradle hello的时候,gradle会执行这个task,接着按照顺序来执行你插入其中的action。一个action可以是一个简单的闭包,并包含一些groovy的代码。

doLast的简写

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

这里还是定义了一个hello的task,使用<<来作为doLast的简写。

脚本即代码

虽然在编写gradle脚本的时候用的是gradle提供的语法,但是我们却可以在其中很自由的使用groovy,如下:

task upper << {
    String someString = 'mY_nAmE'
    println "Original: " + someString 
    println "Upper case: " + someString.toUpperCase()
}

或者

task count << {    4.times { print "$it " }
}

是不是觉得很爽?Groovy灵活而优秀的语法在gradle中可以被很友好的保留了。

task之间的依赖关系

task之间是可以建立依赖关系的,我们看实际代码:

task hello << {    println 'Hello world!'}
task intro(dependsOn: hello) << {    println "I'm Gradle"}

当我们使用命令gradle -q intro,其输出结果如下:

Hello world!I'm Gradle

懒依赖:当添加一个task依赖的时候,这个task当前可以是不存在的:

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

动态task

Groovy的强大之处不仅在于可以用来定义task的具体动作,还可以用来动态定义task。

4.times { counter ->
    task "task$counter" << {
        println "I'm task number $counter"
    }
}

这时候我们就生成了task0,task1,task2,task3这四个task。

使用已经存在的task

一旦task被创建,那么我们就可以使用task对应的API了。还是使用上面的例子:

4.times { counter ->
    task "task$counter" << {
        println "I'm task number $counter"
    }
}
task0.dependsOn task2, task3

我们运行gradle -q task0:

I'm task number 2I'm task number 3I'm task number 0

除了上述的使用现有的task建立以来关系外,还能使用现有的task添加action:

task hello << {    println 'Hello Earth'}
hello.doFirst {    println 'Hello Venus'}
hello.doLast {    println 'Hello Mars'}
hello << {    println 'Hello Jupiter'}

我们运行gradle -q hello:

Hello VenusHello EarthHello MarsHello Jupiter

task额外属性

我们可以给task添加我们需要的额外属性,例如添加属性myProperty,可以使用ext.myProperty来初始化这个属性,接着这个属性就可以被正常的读写了。

task myTask {
    ext.myProperty = "myValue"}task printTaskProperties << {
    println myTask.myProperty
}

定义通用方法

在gradle中我们可以自定一些常用的方法来给多个task使用,如下:

task getThreeNumber <<{    int[] numbers = getNumbers(3);
    numbers.each {        println "number is $it"
    }
}int[] getNumbers(int size){

    def random = new Random()    int[] numbders = new int[size]    for(int i = 0 ; i<size ; i++){
        numbders[i] = random.nextInt(100)
    }
    numbders
}

我们运行gradle -q getThreeNumber:

bogon:gradle-02-build-script-basics scott$ gradle -q getThreeNumber
number is 42number is 35number is 8

默认task

gradle允许用户定义一个或多个默认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!"}

我们运行gradle -q:

Default Cleaning!Default Running!



本文转自 sshpp 51CTO博客,原文链接:http://blog.51cto.com/12902932/1928047,如需转载请自行联系原作者

相关文章
|
1月前
|
SQL Windows Perl
Configuring Automated Maintenance Tasks
Configuring Automated Maintenance Tasks
17 0
|
9月前
|
文字识别 监控 机器人
RPA(Robotic Process Automation)
RPA(Robotic Process Automation)即机器人流程自动化,是一种通过使用软件机器人来自动化业务流程和任务的技术。RPA可以模拟人类的操作行为,通过界面交互、数据处理等方式,自动执行重复性的业务流程和任务,提高工作效率和准确性,降低成本和风险。
212 0
|
5月前
|
JavaScript 前端开发
01-day projects
01-day projects
27 0
This job is stuck, because the project doesn‘t have any runners online assigned to it. Go to Runners
This job is stuck, because the project doesn‘t have any runners online assigned to it. Go to Runners
This job is stuck, because the project doesn‘t have any runners online assigned to it. Go to Runners
|
Java API Kotlin
Gradle Authoring Tasks
在入门教程中,您学习了如何创建简单的任务。 稍后您还学习了如何向这些任务添加额外的行为,并学习了如何在任务之间创建依赖关系。 这一切都是关于简单的任务,但 Gradle 把任务的概念更进一步。 Gradle 支持增强型任务,这些任务具有自己的属性和方法。 这与您习惯使用 Ant 目标的情况大不相同。 这些强化的任务要么是你提供的,要么是内置在 Gradle 的。
86 0
IDEA:cannot start process,the working directory ‘***‘ does not exist
IDEA:cannot start process,the working directory ‘***‘ does not exist
|
Oracle 关系型数据库 Unix
|
Java API Android开发