Gradle与project(三)

目录

Initialzation初始化阶段
解析整个工程中所有project(读取setting.gradle文件),构建所有的project对应的Project对象

Configuration配置阶段
解析所有的project对象中的task,构建好所有task的拓扑图

Execution执行阶段
执行具体的task及其依赖的task

// 配置阶段开始前的监听回调(即:在Initialzation与Configuration之间)
this.beforeEvaluate {}
// 配置阶段完成后的监听回调(即:在Configuration与Execution之间)
this.afterEvaluate {}
// gradle执行完毕后的回调监听(即:在Execution之后)
this.gradle.buildFinished {}

// 与 this.beforeEvaluate {} 一样
this.gradle.beforeProject {}
// 与 this.afterEvaluate {} 一样
this.gradle.afterProject {}

对于idea来说,一个项目实际上就是project,一个Project可以包含很多个模块,一个module继续可以有多个module。

Project

  • Module
  • Module
    • Module
    • Module
  • Module

而对于Gradle而言,Idea中的无论是Project还是Module,都是project,故树状结构如下:

project

  • project
  • project
    • project
    • project
  • project
api作用
getAllprojects()获取工程中所有的project(包括根project与子project)
getSubProjects()获取当前project下,所有的子project(在不同的project下调用,结果会不一样,可能返回null)
getParent()获取当前project的父project(若在rooProject的build.gradle调用,则返回null)
getRootProject()获取项目的根project(一定不会为null)
project(String path, Closure configureClosure)根据path找到project,通过闭包进行配置(闭包的参数是path对应的Project对象)
allprojects(Closure configureClosure)配置当前project和其子project的所有project
subprojects(Closure configureClosure)配置子project的所有project(不包含当前project)

例子:

project('app') { Project project ->  // 一个参数时,可以省略不写,这里只是为了明确参数的类型
  apply plugin : 'com.android.application'
  group 'com.lqr'
  version '1.0.0-release'
  dependencies {}
  android {}
}

// 2、allprojects(Closure configureClosure)
allprojects {
  group 'com.lqr'
  version '1.0.0-release'
}

// 3、subprojects(Closure configureClosure)
subprojects { Project project -> 
  if(project.plugins.hasPlugin('com.android.library')){
    apply from: '../publishToMaven.gradle'
  }
}
// rootProject : build.gradle
// 定义扩展属性
ext {
  compileSdkVersion = 25
  libAndroidDesign = 'com.android.support:design:25.0.0'
}

// app : build.gradle
android {
  compileSdkVersion = this.compileSdkVersion // 父project中的属性,子project可以直接访问使用
  ...
}
dependencies {
  compile this.libAndroidDesign // 也可以使用:this.rootproject.libAndroidDesign
  ...
}

父project中通过ext块定义的属性,子project可以直接访问使用

// rootProject : build.gradle
// 定义扩展属性
ext {
  compileSdkVersion = 25
  libAndroidDesign = 'com.android.support:design:25.0.0'
}

// app : build.gradle
android {
  compileSdkVersion = this.compileSdkVersion // 父project中的属性,子project可以直接访问使用
  ...
}
dependencies {
  compile this.libAndroidDesign // 也可以使用:this.rootproject.libAndroidDesign
  ...
}

hasProperty(‘xxx’):判断是否有在gradle.properties文件定义xxx属性。
在gradle.properties中定义的属性,可以直接访问,但得到的类型为Object,一般需要通过toXXX()方法转型。

// gradle.properties
// 定义扩展属性
isLoadTest=true
mCompileSdkVersion=25

// setting.gradle
// 判断是否需要引入Test这个Module
if(hasProperty('isLoadTest') ? isLoadTest.toBoolean() : false) {
  include ':Test'
}

// app : build.gradle
android {
  compileSdkVersion = mCompileSdkVersion.toInteger()
  ...
}
api作用
getRootDir()获取rootProject目录
getBuildDir()获取当前project的build目录(每个project都有自己的build目录)
getProjectDir()获取当前project目录
File file(Object path)定位一个文件,相对于当前project开始查找
ConfigurableFileCollection files(Object… paths)定位多个文件,与file类似
copy(Closure closure)拷贝文件
fileTree(Object baseDir, Closure configureClosure)定位一个文件树(目录+文件),可对文件树进行遍历
// 打印common.gradle文件内容
println getContent('common.gradle')
def getContent(String path){
  try{
    def file = file(path)
    return file.text
  }catch(GradleException e){
    println 'file not found..'
  }
  return null
}

// 拷贝文件、文件夹
copy {
  from file('build/outputs/apk/')
  into getRootProject().getBuildDir().path + '/apk/'
  exclude {} // 排除文件
  rename {} // 文件重命名
}

// 对文件树进行遍历并拷贝
fileTree('build/outputs/apk/') { FileTree fileTree ->
    fileTree.visit { FileTreeElement element ->
        println 'the file name is: '+element.file.name
        copy {
            from element.file
            into getRootProject().getBuildDir().path + '/test/'
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值