Gradle是个好东西,然而要用它要求有点高。
我还是先从HelloWorld学起。
安装
mac上安装很简单,用sdkman即可。
(没有sdkman的可以先安装)
curl -s https://get.sdkman.io | bash
sdk install gradle 3.2.1
这么安装貌似啥也不用配。
安装完之后,国际惯例。
gradle -v
检查是否安装成功
Hello World
gradle命令会在当前目录找一个build.gradle文件。
于是。来一个build.gradle
task hello {
doLast {
print "Hello World";
}
}
执行gradle -q hello
输出 Hello World
(这个命令中的q是代表quiet模式,屏蔽一些日志的输出。只输出代码中要求输出的。)
这里发生了啥呢?
这个构建脚本定义了一个task,名字是hello.并且加入了一个action。
运行gradle hello时,会执行这个task,也就执行了这个action.
这个action是一个包含了一些Groovy代码的闭包。(闭包这个概念。。。😌,我啥时候才能弄明白)
记不清这是第几个HelloWorld了,也不知道未来还有多少个HelloWorld。在码农这条道路上越走越远了。
More than helloWorld
既然是用到了Groovy,那也试试Groovy的语法好了。
task upper << {
print "Hello World".toUpperCase()
4.times {print "$it"}
}
<<是doLast的一种替代,guide中都是这么用的,比较方便。然而,在执行gradle upper时,出现了warning:
The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
at build_3zqc02fou2be1vy7eylxf95tp.run(/Users/lulei/gradleLearning/build.gradle:1)
任务之间的依赖
任务之间可能会存在一定的依赖关系
build.gradle
task hello << {
print "Hello World"
}
task intro(dependsOn: hello) << {
print "I'm Gradle"
}
> 输出
[luleideMacBook-Pro:gradleLearning lulei$ gradle intro
:hello
Hello World:intro
I'm Gradle
BUILD SUCCESSFUL
依赖之间的顺序不重要
build.gradle
task taskX(dependsOn: 'taskY') << {
println 'taskX'
}
task taskY << {
println 'taskY'
}
taskX依赖于taskY, 但是taskY却在之后定义,build依然能够正常运行。
动态任务
利用Groovy,我们不仅可以定义task,同时,我们还可以动态地生成任务。
build.gradle
4.times { counter ->
task "task$counter" << {
println "I'm counter $counter"
}
}
task0.dependsOn task1
task0.doFirst {
println "doFirst"
}
上面的程序动态地创建了task0, task1, task2, task3
可以通过
gradle taks0
执行任务task0
同时还可以看到,上面的程序中有 task0.dependsOn task1
,可以通过这个来添加额外的依赖。
同时,还可以给已存在的task加行为。(task0.doFirst{}
)
shortcut notation
每个任务都可以通过短标记$来访问。
task0.doFirst {
println "$task0.name"
}