相关文章
前言
gradle 内容超级多,可以进官网看一下,完全可以写一本犀牛书。在进行官网学习时非常容易迷失在小树林里!!因为内容非常多,所以拆分成一小节一小节进行学习记录。
前几篇文章认识了gradle 现在我们要进行gradle脚本的编写,编写gradle最重要的概念是project,plugins和task
Gradle中,每一个待编译的工程都叫一个Project。每一个Project在构建的时候都包含一系列的Task。比如一个Android APK的编译可能包含:Java源码编译Task、资源编译Task、JNI编译Task、lint检查Task、打包生成APK的Task、签名Task等。一个Project到底包含多少个Task,其实是由编译脚本指定的插件决定。插件是什么呢?插件就是用来定义Task,并具体执行这些Task的东西。Task 是 Gradle 执行的基本单元。 Task 是完成一类任务,实际上对应的也是一个对象。而 Task 是由无数个 Action 组成的,Action 代表的是一个个函数、方法,每个 Task 都是一堆 Action 按序组成的执行图,就好像我们在 Class 的 main 函数中按照逻辑调用一系列方法一样。 创建一个task
自定义一个入门task
tasks.register("test") {
doLast {
println("aaaaaaaaaa")
}
}
使用命令gradlew -q test 运行task 可以看到以下运行结果
-q 命令作用: 我们可以运行gradlew --help查看解释 只输出失败日志 成功日志会被忽略掉
一个计数的task doFirst{...}、doLast{...} 接受的都是闭包 ,doFirst是在excute之前执行,doLast是在excute最后执行
tasks.register("count") {
doLast {
repeat(4) { print("$it ") }
}
}
执行命令>gradlew -q count
控制台会打印0,1,2,3
task依赖性
声明依赖其他任务,下面代码中定义了一个intro任务依赖于hello 使用task dependsOn进行依赖 被依赖的任务会执行顺序如下:
A.dependsOn B --> 执行A的时候先执行B
A.mustRunAfter B --> 同时执行 A/B,先执行B再执行A,若执行关系不成立报错
A.shouldRunAfter B --> 同 mustRunAfter,但是执行关系不成立不会报错
tasks.register("hello") {
doLast {
println("Hello world!")
}
}
tasks.register("intro") {
dependsOn("hello")
doLast {
println("I'm Gradle")
}
}
执行 gradlew -q intro
Hello world! I'm Gradle
task 可以循环注册多个相同的任务 使用kotlin repeat 内联函数或者for循环
repeat(4) { counter ->
tasks.register("task$counter") {
doLast {
println("I'm task number $counter")
}
}
}
doLast只会执行一次在configration完成之后 执行gradlew -q task1 I'm task number 1
tasks.named("task0") { dependsOn("task2", "task3") }
添加依赖性
输出 I'm task number 2 I'm task number 3 I'm task number 0
Gradle 允许定义一个或多个默认任务,如果没有指定其他任务,则执行这些任务。
defaultTasks("clean", "run")
task("clean") {
doLast {
println("Default Cleaning!")
}
}
tasks.register("run") {
doLast {
println("Default Running!")
}
}
执行 gradlew -q
输出:Default Cleaning! Default Running!
插件:
我们写项目要使用大量的第三方代码,Gradle 作为构建工具,自然要拥有管理第三方代码的能力,要不怎么打包生成最终输出物。因为这些额外的代码要打入最终的生成物中,所以管理第三方代码的功能 Gradle 是必须要有的.
这些第三方代码有些是参与业务代码的,有些则是参与项目构建的:
参与项目构建的第三方代码叫 --> 插件
参与代码逻辑的第三方代码叫 --> 依赖
不管是插件,还是依赖,本质都是一堆类、函数,就是 API,区别是使用的地方不同。