build 之前执行task_从零开始学习Gradle之二---如何使用Task

本文介绍了Gradle中Task的定义,包括System Properties、Project Properties和Ext Properties的使用,以及Task间的依赖关系设置。通过示例展示了如何创建Task、设置依赖以及使用onlyIf决定Task是否执行。
摘要由CSDN通过智能技术生成

2. 定义属性

在Gradle中,我们可以定义以下三种属性并使用它们:

1)System Properties

System Properties 实际是指的JVM的system properties。我们知道,在运行java程序时,可以使用-D来设置Java的系统变量,在Gradle中,你也可以做同样的事情。比如

gradle xxx -DmySystemProp=xxxx

同时,在build.gradle中,应该这样使用这个变量:

task printSysProps <

println System.properties['system']

}

2)Project Properties

Project Properties是Gradle专门为Project定义的属性。它的最大优点在于当运行gradle的时候,我们可以使用-P来设置它的值。比如,

gradle xxx -PmyProjectProp=xxxxx

而在build.gradle中,可以这样使用这个变量:

task printProps <

if (project.hasProperty('commandLineProjectProp')) {

println commandLineProjectProp

}

}同时,当我们执行gradle properties查看属性列表时,这个变量的名称以及值会显示在结果中。

3)Ext(ra) Properties

另外,我们还可以为Project或者Task定义Ext属性,也称动态属性,我们必须使用关键字ext(对应ExtraPropertiesExtension的实例)去定义动态属性。从这点可以看出,Gradle已经为我们设计了很多不同的类,去做不同的事情,我们只需要遵循Convention,使用他们即可。如果忘记写ext关键字,gradle运行时则会提示:

"Dynamic properties are deprecated...."。这是因为以前版本的gradle定义动态属性时,不需要加ext关键字的。

对于Project和Task而言,动态属性定义的方式完全一样,只是作用域不一样。

当定义完成后,我们就可以使用project.prop 或者 task.prop来访问这些动态属性了。下面让我们看一个例子:

ext.projectProperties="ext projectProperties-value"

task printExtProps <

ext.taskProperties="ext.task.properties-value"

if (project.hasProperty('projectProperties')){

println "ext.projectProperties values is " + projectProperties

}

if (printExtProps.hasProperty('taskProperties')){

println "task has defined ext.taskProperties value is " + taskProperties

}

}

注意:,对于ext定义的动态属性,并不能通过外部的方式修改它的值,只能在build.gradle中去设置或者修改它的值。

同时,如果是为project定义的ext动态属性,也会显示在gradle properties的结果中。

3. Task依赖

当构建一个复杂的项目时,不同task之间存在依赖是必然的。比如说,如果想运行'部署'的task,必然要先运行 编译、打包、检测服务器等task,只有当这被些被依赖的task执行完成后,才会部署。对于这种行为之间的依赖,Ant、Maven都提供了声明式的定义,非常简单。同样,使用Gradle定义task之间的依赖也是件很容易的事。

例如,定义如下两个Task,并且在"intro"里加上"dependendsOn"的关键字,如下所示:

task hello <

println 'Hello world!'

}

task intro(dependsOn: hello) <

println "I'm Gradle"

}执行 "gradle intro",结果将是:

Hello World

I'm Gradle

由此可见,当执行gradle intro时,intro依赖的task hello会先被执行。除此之外,dependensOn也支持定义多个task的依赖,使用[]括起来即可。例如

task A(dependensOn:['B','C','D']) <

除了使用dependensOn跟字符串来定义依赖,我们也可以使用taskX.dependensOn taskY这种形式:

task taskX <

println 'taskX'

}

task taskY <

println 'taskY'

}

taskX.dependsOn taskY

或者,也可以使用闭包:

task taskX <

println 'taskX'

}

taskX.dependsOn {

tasks.findAll { task -> task.name.startsWith('lib') }

}

task lib1 <

println 'lib1'

}

除了之前讲的task的部分,Gradle还为我们提供了很多可用的API,更多的细节大家可以参考下Gradle的文档。这里我列出一个常用的方法onlyIf。在Gradle里,我们可以使用“OnlyIf()”来决定当前task是否需要被执行,例如:新建build.gradle,加入如下代码:

task hello <

println 'hello world'

}

hello.onlyIf { !project.hasProperty('skipHello') }

当我们直接执行"gradle hello"时,没有任何结果,当我们执行"gradle hello -PskipHello=xxxx"时,会输出"hello world"。

4. 总结

OK.今天对gradle的总结到此为止。总体而言,用DSL的代码而不是xml来定义构建的过程,还是很fancy的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值