Android Gradle指南--3.Gradle构建脚本基础

470 阅读2分钟

1. settings.gradle
用于初始化及工程树的配置,大多是为了配置子工程,gradle中多工程通过工程树表示;

一个子工程, 只有在settings文件中配置了, gradle才会识别,才会在构建(build)的时候被包含进去;

rootProject.name='LjyWechatDemo'
include ':app'
include ':ljylib'
//指定ljylib的目录,不指定默认为settings.gradle同级目录
project(':ljylib').projectDir=new File(rootDir,'library/ljylib')

2. build文件 每个project都会有一个build文件,在此对project进行配置,如配置版本,所需插件,依赖库等; Root Project可以获取到所有的ChildProject, 因此可以在其build文件中对子工程进行统一配置,如Maven中心库

allprojects {    
    repositories {        
        jcenter()        
        maven { url 'https://maven.google.com' }    
    }
}
//allprojects和subprojects这两个方法,接受一个闭包作为参数,对工程进行遍历,遍历的过程中调用我们自定义的闭包,
//所以我们可以在闭包里配置,打印,输出或修改project的属性

3. projects以及tasks
Project: 可以看做一个独立的模块, 利用好可以做到高内聚低耦合; Task:一个project可以包含多个task, task就是一个操作,一个原子性的操作,和ant里的target,maven里的goal一样;

4. 创建一个任务

task customTask1{    
    doFirst {        
        println 'customTask1:doFirst'    
    }    
    doLast {        
        println 'customTask1:doLast'    
    }    
    customTask2
}

tasks.create("customTask2"){ 
    doFirst {        
        println 'customTask2:doFirst'    
    }    
    doLast {        
        println 'customTask2:doLast'    
    }
}

5. 任务依赖
任务之间可以有依赖关系,可以控制哪些任务先执行,哪些后执行; 通过dependsOn可以指定其依赖的任务,一个任务可以依赖多个任务

task funHello {    
    println('hello~~ ')
}
task funWorld {    
    println('wprld!!!')
}
task funMain1(dependsOn: funHello) {    
    doFirst {        
        println('main1.doFirst')    
    }    
    doLast {        
        println('main1.doLast')    
    }
}
task funMain2 {    
    dependsOn(funHello, funWorld,customTask1)    
    doFirst {        
        println('main2.doFirst')    
    }    
    doLast {        
        println('main2.doLast')    
    }
}

6. 任务间通过API控制,交互
创建一个任务和定义变量是一样的,变量名就是任务名,类型是task; 脚本是顺序执行的, 必须先定义声明;

println(project.hasProperty('funWorld'))
//打印true,说明每个任务都是project的一个属性

7. 自定义属性
project和task允许用户添加额外的自定义属性 相比局部变量,自定义属性有更广泛的作用域,可以跨project,跨task访问,只要你能访问到这些属性所属的对象; 还可以给sourceSet添加自定义属性 (SourceSets被称作源代码集合,一般可以用它来指定资源的路径)

8. 脚本即代码,代码即脚本
gradle脚本中也可以定义class,内部类,导入包,定义方法,常量,接口,枚举等

def buildTime(){    
    def date=new Date()    
    def formattedDate=date.format('yyy-MM-dd')    
    return formattedDate
}

task showTime{    
    doFirst {        
        println("currentTime=${buildTime()}")    
    }
}

我是今阳,如果想要进阶和了解更多的干货,欢迎关注公众号”今阳说“接收我的最新文章