位于项目根目录下,用于项目的配置,常见的是配置子工程。可以类比认识,根工程对应AndroidStudio项目中的Project,子工程对应Module。
一个子工程只有在setting.gradle中配置了,才能够被识别,构建的时候才会被包含进去。
rootProject.name = "GradleGuide"
include ':app'
include ':demo'
project(":demo").projectDir=new File(rootDir,"demo")
//rootDir的路径为xxx/xxx/xxx/GradleGuide
rooDir项目的根目录。
project(“:demo”).projectDir=new File(rootDir,“demo”)
此行代码是给子工程demo指定路径。非必需,如果不指定,默认为include ':demo"中demo同级的目录。
每个Project都有一个build.gradle文件,作为构建的入口。在这个文件中可以配置版本,插件,依赖库等。
对于Root Project也会有一个build.gradle文件,在这个文件中可以获取到所有的Child Project,并对他们进行统一的配置,例如应用的插件,Maven库等。
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.1.3"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.30"
}
}
allprojects {
repositories {
google()
mavenCentral()
maven {
url "https://oss.sonatype.org/content/groups/staging"
}
}
}
subprojects {
repositories {
google()
mavenCentral()
}
}
allprojects:对所有的Projet进行配置。
subprojects:对所有的子Project进行配置。
Project直译就是项目,在Gradle中会有很多Project,例如在一个Android项目中,有根工程,有module,module又分Application和Library。其实它们都可以理解为是Project,只不过根工程是rootProject,而Module是Project,但实际上都可以理解为是Project。
task printProjects {
println "------rootProject------"
println rootProject.toString()
println "------rootProject.getRootProject()------"
println rootProject.getRootProject().toString()
println "------rootProject.getChildProjects()------"
def childProjects = rootProject.getChildProjects()
childProjects.each {
println "key=${it.key},value=${it.value}"
}
}
输出结果:
------rootProject------
root project 'GradleGuide'
------rootProject.getRootProject()------
root project 'GradleGuide'
------rootProject.getChildProjects()------
key=app,value=project ':app'
通过代码输出结果与工程截图对比可以发现,RootProject是GradleGuide,子Project是app。
Project下有很多属性和方法,这里只是简单的使用了两个。
Task可以理解为是Gradle的一个执行单元,一个操作,也可以理解为是Project的一个属性。创建一个任务和定义一个Project的变量一样,变量名就是任务名。类型为Task(org.gradle.api),所以可以通过任务名来时使用Task的API来进行访问和控制。
task sayHi{
println "Hello World"
}
task testTask {
project.sayHi
}
输出结果:
Hello World
可以看到定义两个task,sayHi,testTask,在testTask中通过project.sayHi的形式来调用。所以把Task理解为Project的一个属性也是没有问题的。
可以看到创建任务的task并不是一个关键字而是一个方法。
tasks.create("testTasks"){
println "testTasks"
}
输出结果:
testTasks
任务依赖可以使用dependsOn方法来实现,可以接受多个依赖的任务作为参数。
task beforeSayHi {
doLast {
println "beforeSayHi"
}
}
task sayHi(dependsOn:beforeSayHi) {
// dependsOn beforeSayHi
doLast {
println "sayHi"
}
}
输出结果:
> Task :beforeSayHi
beforeSayHi
> Task :sayHi
sayHi
通过任务名进行任务的操作需要先声明,其原理是:Project在创建任务的时候,同时会把任务注册为Project的一个属性,类型是Task。可以通过project.hasProperty方法来验证。
def Task taskOne = task(taskOne) {
}
taskOne.doFirst {
println "taskOne-doFirst"
}
taskOne.doLast {
println project.hasProperty("taskOne")
println "taskOne-doLast"
}
task sayHi {
}
sayHi.doFirst {
println "sayHi-doFirst"
}
sayHi.doLast {
println project.hasProperty("sayHi")
println "sayHi-doLast"
}
task entrance{
dependsOn taskOne,sayHi
}
输出结果:
> Task :sayHi
sayHi-doFirst
true
sayHi-doLast
> Task :taskOne
taskOne-doFirst
true
taskOne-doLast
Project和Task都支持添加自定义属性。可以通过ext属性来进行添加和访问,设置多个属性可以使用ext代码块。
其实可以在四个文件中定义:
文件名称 | 定义方式 | 访问方式 | 作用域 |
---|---|---|---|
settings.gradle | gradle.ext或gradle.ext{} | gradle.ext.xxx | all |
build.gradle(root) | ext或ext{} | rootProject.ext或$(只在当前project有效) | build.gradle(root,module,自定义) |
build.gradle(module) | ext或ext{} | project.ext或$(只在当前project有效) | build.gradle(module) |
自定义gradle | 同root,module | 同root,module | 同root,module |
//settings.gradle文件
rootProject.name = "GradleGuide"
include ':app'
gradle.ext.settings="settings"
gradle.ext{
fileName="settings.gradle"
}
RootProject:build.gradle文件
task printSettingsExt{
println gradle.ext.settings
println gradle.ext.fileName
}
输出结果:
settings
settings.gradle
在其它Project的build.gradle可以通过rootProject,ext.xxx来进行访问。
apply from:"version.gradle"
ext.name123="kylp"
ext.set("age",20)
ext{
city="北京"
}
task testExt{
println "name=$name123"
println "go=$go"
println rootProject.ext.name123
println rootProject.ext.age
println rootProject.ext.find("city")
println rootProject.hasProperty("name123")
}
其中versionl.gradle为自定义新建的gradle文件。
version.gradle文件
ext.go="gogogoggogo"
输出结果:
name=kylp
go=gogogoggogo
kylp
20
北京
true
ext.paramInAppModule="app"
task printExt {
println "$paramInAppModule"
println project.ext.paramInAppModule
}
输出结果:
app
app
同build.grad(root,module)文件。
在build.gradle(module)中获取build.gradle(root)定义的属性使用rootProject.ext.xxx。