当前位置:   article > 正文

Gradle构建脚本基础(三)_settings.gradle

settings.gradle

1. settings.gradle文件
位于项目根目录下,用于项目的配置,常见的是配置子工程。可以类比认识,根工程对应AndroidStudio项目中的Project,子工程对应Module。
一个子工程只有在setting.gradle中配置了,才能够被识别,构建的时候才会被包含进去。

  1. rootProject.name = "GradleGuide"
  2. include ':app'
  3. include ':demo'
  4. project(":demo").projectDir=new File(rootDir,"demo")
  5. //rootDir的路径为xxx/xxx/xxx/GradleGuide

rooDir项目的根目录。
project(“:demo”).projectDir=new File(rootDir,“demo”)
此行代码是给子工程demo指定路径。非必需,如果不指定,默认为include ':demo"中demo同级的目录。

2. build.gradle文件
每个Project都有一个build.gradle文件,作为构建的入口。在这个文件中可以配置版本,插件,依赖库等。
对于Root Project也会有一个build.gradle文件,在这个文件中可以获取到所有的Child Project,并对他们进行统一的配置,例如应用的插件,Maven库等。
 

  1. buildscript {
  2. repositories {
  3. google()
  4. mavenCentral()
  5. }
  6. dependencies {
  7. classpath "com.android.tools.build:gradle:7.1.3"
  8. classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.30"
  9. }
  10. }
  11. allprojects {
  12. repositories {
  13. google()
  14. mavenCentral()
  15. maven {
  16. url "https://oss.sonatype.org/content/groups/staging"
  17. }
  18. }
  19. }
  20. subprojects {
  21. repositories {
  22. google()
  23. mavenCentral()
  24. }
  25. }

allprojects:对所有的Projet进行配置。
subprojects:对所有的子Project进行配置。

3.Project
Project直译就是项目,在Gradle中会有很多Project,例如在一个Android项目中,有根工程,有module,module又分Application和Library。其实它们都可以理解为是Project,只不过根工程是rootProject,而Module是Project,但实际上都可以理解为是Project。
 

  1. task printProjects {
  2. println "------rootProject------"
  3. println rootProject.toString()
  4. println "------rootProject.getRootProject()------"
  5. println rootProject.getRootProject().toString()
  6. println "------rootProject.getChildProjects()------"
  7. def childProjects = rootProject.getChildProjects()
  8. childProjects.each {
  9. println "key=${it.key},value=${it.value}"
  10. }
  11. }

 

输出结果:

  1. ------rootProject------
  2. root project 'GradleGuide'
  3. ------rootProject.getRootProject()------
  4. root project 'GradleGuide'
  5. ------rootProject.getChildProjects()------
  6. key=app,value=project ':app'


通过代码输出结果与工程截图对比可以发现,RootProject是GradleGuide,子Project是app。
Project下有很多属性和方法,这里只是简单的使用了两个。

4.Task
Task可以理解为是Gradle的一个执行单元,一个操作,也可以理解为是Project的一个属性。创建一个任务和定义一个Project的变量一样,变量名就是任务名。类型为Task(org.gradle.api),所以可以通过任务名来时使用Task的API来进行访问和控制。

4.1Task创建
4.1.1 通过task创建

  1. task sayHi{
  2.     println "Hello World"
  3. }
  4. task testTask {
  5.     project.sayHi
  6. }


输出结果:

Hello World


可以看到定义两个task,sayHi,testTask,在testTask中通过project.sayHi的形式来调用。所以把Task理解为Project的一个属性也是没有问题的。
 

可以看到创建任务的task并不是一个关键字而是一个方法。

4.1.2通过TaskContainer对象tasks创建

  1. tasks.create("testTasks"){
  2.     println "testTasks"
  3. }


输出结果:

testTasks


4.2 任务依赖
任务依赖可以使用dependsOn方法来实现,可以接受多个依赖的任务作为参数。
 

  1. task beforeSayHi {
  2.     doLast {
  3.         println "beforeSayHi"
  4.     }
  5. }
  6. task sayHi(dependsOn:beforeSayHi) {
  7. //    dependsOn beforeSayHi
  8.     doLast {
  9.         println "sayHi"
  10.     }
  11. }


输出结果:

  1. > Task :beforeSayHi
  2. beforeSayHi
  3. > Task :sayHi
  4. sayHi

 

4.3任务控制

通过任务名进行任务的操作需要先声明,其原理是:Project在创建任务的时候,同时会把任务注册为Project的一个属性,类型是Task。可以通过project.hasProperty方法来验证。

  1. def Task taskOne = task(taskOne) {
  2. }
  3. taskOne.doFirst {
  4. println "taskOne-doFirst"
  5. }
  6. taskOne.doLast {
  7. println project.hasProperty("taskOne")
  8. println "taskOne-doLast"
  9. }
  10. task sayHi {
  11. }
  12. sayHi.doFirst {
  13. println "sayHi-doFirst"
  14. }
  15. sayHi.doLast {
  16. println project.hasProperty("sayHi")
  17. println "sayHi-doLast"
  18. }
  19. task entrance{
  20. dependsOn taskOne,sayHi
  21. }

输出结果:

  1. > Task :sayHi
  2. sayHi-doFirst
  3. true
  4. sayHi-doLast
  5. > Task :taskOne
  6. taskOne-doFirst
  7. true
  8. taskOne-doLast

4.4自定义属性
Project和Task都支持添加自定义属性。可以通过ext属性来进行添加和访问,设置多个属性可以使用ext代码块。

其实可以在四个文件中定义:

settings.gradle
build.gradle(root)
build.gradle(module)
自定义gradle文件

在settings.gradle文件中定义

  1. //settings.gradle文件
  2. rootProject.name = "GradleGuide"
  3. include ':app'
  4. gradle.ext.settings="settings"
  5. gradle.ext{
  6.     fileName="settings.gradle"
  7. }
  1. RootProject:build.gradle文件
  2. task printSettingsExt{
  3.     println gradle.ext.settings
  4.     println gradle.ext.fileName
  5. }


输出结果:

  1. settings
  2. settings.gradle

在build.gradle(root)文件中

在其它Project的build.gradle可以通过rootProject,ext.xxx来进行访问。

  1. apply from:"version.gradle"
  2. ext.name123="kylp"
  3. ext.set("age",20)
  4. ext{
  5. city="北京"
  6. }
  7. task testExt{
  8. println "name=$name123"
  9. println "go=$go"
  10. println rootProject.ext.name123
  11. println rootProject.ext.age
  12. println rootProject.ext.find("city")
  13. println rootProject.hasProperty("name123")
  14. }

其中versionl.gradle为自定义新建的gradle文件。
version.gradle文件

ext.go="gogogoggogo"


输出结果:

  1. name=kylp
  2. go=gogogoggogo
  3. kylp
  4. 20
  5. 北京
  6. true

在build.gradle(module)文件中

  1. ext.paramInAppModule="app"
  2. task printExt {
  3.     println "$paramInAppModule"
  4.     println project.ext.paramInAppModule
  5. }


输出结果:

  1. app
  2. app


在自定义xxx.gradle文件中
同build.grad(root,module)文件。

不同build.gradle属性获取
在build.gradle(module)中获取build.gradle(root)定义的属性使用rootProject.ext.xxx。
 


————————————————
版权声明:本文为CSDN博主「KyungLip」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/KyungLip/article/details/124435158

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/479797
推荐阅读
相关标签
  

闽ICP备14008679号