Gradle脚本基础
jopen
10年前
Gradle中所有的东西都是基于两个概念:tasks和projects,每一个Gradle构建都是有一个或多个projects组成的。 project的概念比较广泛,具体看你在Gradle中是怎么定义的,它可能代表一个jar包或者一个Web 应用,也可能代表由其他project的jar包组成的分布式zip文件。project不仅可以代表一个将要编译的东西,它还可以代表即将要完成的事 情,比如部署你的应用到生产环境。每一个projcet都是有一个或多个tast组成,一个task代表一个编译操作的一些原子操作,比如编译一些 class,创建一个jar包,生成java文档等,下面是我学习Gradle向导笔记
1.简短的task定义
task hello << {
println 'Hello world!'
}
2.Gradle脚本中执行代码
task upper << {
String s = "my name is wangliqiang"
println "origin : "+s
println "upper: "+s.toUpperCase()
}
输出:
origin : my name is fanfanxiaozu
upper: MY NAME IS FANFANXIAOZU
3.Gradle中一个task可以依赖另一个task
task first << {
println "I am first "
}
task second(dependsOn:first) << {
println "I am second,and i depend on first"
}
输出:
I am first
I am second,and i depend on first
如果定义依赖的时候,被依赖的task还没有定义则需要加引号来使用,否则会报错
task second(dependsOn:'first') << {
println "I am second,and i depend on first"
}
task first << {
println "I am first "
}
4.动态定义task,下面代码表示动态定义6个task0-task5,当执行gradle -q task5 时会打印出“i am task 5”
6.times{i ->
task "task$i" << {
println "i am task $i"
}
}
5.使用已有的task
对task动态添加依赖
6.times{i ->
task "task$i" << {
println "i am task $i"
}
}
task0.dependsOn task5,task3,task2
执行gradle task0
输出:
i am task 2
i am task 3
i am task 5
i am task 0
task hello << {
println 'hello,fanfanxiaozu'
}
hello.doFirst{
println 'hello,fanfanxiaozu,before'
}
hello.doFirst{
println 'hello,fanfanxiaozu,before1'
}
hello.doLast{
println 'hello,fanfanxiaozu,after'
}
hello << {
println 'hello,fanfanxiaozu,after1'
}
输出:
hello,fanfanxiaozu,before1
hello,fanfanxiaozu,before
hello,fanfanxiaozu
hello,fanfanxiaozu,after
hello,fanfanxiaozu,after
doFirst和doLast可以执行很多次,该命令是向action list中的开始和末尾添加其他action,<< 是doLast的别名。
task fanfanxiaozu << {
println 'hello,fanfanxiaozu'
}
fanfanxiaozu.doFirst{
println "access task ,$fanfanxiaozu.name"
}
输出:
access task ,fanfanxiaozu
hello,fanfanxiaozu
7.为task添加自定义的属性
task fanfanxiaozu {
ext.age = "young"
}
task printTaskProperties << {
println "access task ,$fanfanxiaozu.age"
}
输出 :
access task ,young
8.使用方法
task checksum << {
fileList('../antLoadfileResources').each {File file ->
ant.checksum(file: file, property: "cs_$file.name")
println "$file.name Checksum: ${ant.properties["cs_$file.name"]}"
}
}
task loadfile << {
fileList('../antLoadfileResources').each {File file ->
ant.loadfile(srcFile: file, property: file.name)
println "I'm fond of $file.name"
}
}
File[] fileList(String dir) {
file(dir).listFiles({file -> file.isFile() } as FileFilter).sort()
}
9.定义default task,这里需要指出的是如果一个子工程没有定义default task,会使用它父工程的default task(假如定 义的话)
defaultTasks 'fanfanxiaozu','fly'
task fanfanxiaozu << {
println 'i am default task fanfanxiaozu'
}
task fly << {
println 'i am default task fly'
}
println 'i am not default tast'
}
执行gradle -q 输出:
i am default task fanfanxiaozu
i am default task fly
10.Gradle有配置阶段和执行阶段,在执行完配置阶段后,Gradle知道所有应该被执行的task。Gradle提供了一个钩子来使用这个信息, 一个常用的例子是检查release task是否在即将被执行的task里面,而起根据此接口,你可以给一些变量赋予不同的值。
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'
}
}
> gradle -q distribution
We build the zip with version=1.0-SNAPSHOT
> gradle -q release
We build the zip with version=1.0
We release now
一个比较重要的点是whenReady钩子影响了release task的执行