Gradle 是一种开源构建自动化工具,足够灵活,可以构建几乎任何类型的软件。支持依赖管理和多项目,类似 Maven。
定义任务名称:任务名称必须是一个有效的标识符,以描述任务的具体操作。
指定任务依赖项:可以指定任务依赖项,即指定该任务必须在执行其它任务之后再执行。这样可以确保任务按正确的顺序执行,以避免出现构建错误。
配置任务行为:可以在任务中使用闭包或方法来定义任务的行为。
编写一个build.gradle文件:
task demo {
// doFirst是一个闭包,在任务执行之前执行。使用doFirst可以在任务执行之前添加某些动作
doFirst {
println "start my task"
}
// doLast是一个闭包,在任务执行之后执行。使用doLast可以在任务执行之后添加某些动作
doLast {
println "end my task"
}
}
任务的依赖是指一个任务需要另一个任务完成之后才能执行。通过定义任务之间的依赖关系,可以确保任务按正确的顺序执行,从而避免构建错误。
任务依赖关系可以是单向的,也可以是双向的。
task A {
doFirst {
println "任务A"
}
}
task B(dependsOn:"A") {
doFirst {
println "任务B"
}
}
也可以依赖多个任务
task C {
dependsOn(B, A)
doFirst {
println "任务C"
}
}
注意:使用dependsOn依赖的任务会默认在当前任务之前执行。
多依赖顺序执行
task D {
dependsOn A,B
// 表示被依赖的任务必须在当前任务之前执行,即强制必须按指定的顺序执行。
mustRunAfter B
// 表示被依赖的任务应该在当前任务之前执行,即尽量按指定的顺序执行,但不是必须的。
shouldRunAfter A
doFirst {
println "任务C"
}
}
A.dependsOn(B)
注意:如果存在循环依赖或者不能解析依赖关系导致的死锁情况,Gradle会抛出异常。因此,在定义任务依赖关系时应该避免循环依赖,并确保依赖关系正确。
动态任务是在构建运行时根据条件动态地生成的任务,可以根据需要在构建过程中动态地生成或删除任务。
task executeTasks {
doLast {
tasks.findAll {it.name.startsWith("task")}.each { task ->
println "Executing ${task.name}"
}
}
}
(1..5).each { num ->
def taskName = "task${num}"
tasks.create(taskName) {
doLast {
println "Task ${taskName} has been executed."
}
}
executeTasks.dependsOn(tasks."${taskName}")
}
任务属性定义语法是在任务对象外部使用ext关键字,并使用属性名来定义任务属性。
task myTask {
ext.myProperty = "Hello, world!"
doLast {
println myProperty
}
}
String appenStr(String s1, String s2) {
return s1 + s2
}
task myTaskB {
doLast {
println appenStr("Hello", "Gradle")
}
}
懒加载方式(只有在当任务被使用时才会进行初始化):
def myMethod() {
println "我的方法"
}
project.getTasks().register("myTask") {
doLast {
myMethod()
}
}
另一种定义方式:
// 此处表示是一个自定义的任务类型
// 需要注意的是,@TaskAction只存在于继承自DefaultTask的类型中
class MyTaskC extends DefaultTask {
@TaskAction
def myAction() {
println "Hello, World!"
}
}
task myTaskC(type: MyTaskC)
定一个或多个默认任务,也可以使用settings.gradle.kts文件中的rootProject.defaultTasks属性来指定。
在执行gradle命令时,如果没有指定要执行的任务,则会默认执行myTaskC和myTask这两个任务。
rootProject.defaultTasks("myTaskC", "myTask")
gradle.taskGraph.whenReady { taskGraph ->
println "=== Task Execution Graph ==="
taskGraph.getAllTasks().each { task ->
println task.name
}
println "=== End of graph ==="
}
// Maven仓库中心
repositories {
mavenCentral()
}
// 本地Maven仓库
repositories {
mavenLocal()
}
// 自定义的仓库地址
repositories {
maven {
url "仓库地址"
}
}
// 需要密码的仓库的配置方式- 基本认证方式
repositories {
maven {
url '仓库地址'
credentials {
username "user"
password "password"
}
authentication {
basic(BasicAuthentication)
}
}
}
// 需要密码的仓库的配置方式- Header认证方式
repositories {
maven {
url "仓库地址"
credentials(HttpHeaderCredentials) {
name = "Private-Token"
value = "TOKEN"
}
authentication {
header(HttpHeaderAuthentication)
}
}
}
compileOnly(仅在编译时)、annotationProcessor(编译时)、testImplementation(测试时,编译和运行时)、implementation(编译和运行时)、runtimeOnly(仅在运行时)等
dependencies {
implementation '依赖地址'
compileOnly '依赖地址'
annotationProcessor '依赖地址'
testImplementation '依赖地址t'
implementation '依赖地址'
}
dependencies {
implementation('依赖地址') {
exclude group: '依赖地址'
}
implementation '依赖地址'
}
每个依赖项都可以有一个或多个transitive依赖项,这些依赖项通常是该依赖项所依赖库的依赖项。transitive依赖项通常是自动传递的,因为一个库很少能够在自己的代码中实现所有功能。因此,当一个库被引入项目中时,它可能还会引入其他依赖项。Gradle的默认行为是启用transitive依赖项。
使用transitive关键字来控制依赖项的transitive依赖。例如,使用transitive = false将禁用依赖项的transitive依赖,
dependencies {
implementation('依赖地址') {
transitive = false
}
}
《实战Gradle》