Project的介绍

1. Settings

讲到settings那就得先了解 gradle 构建过程

gradle的构建过程分为三部分:初始化阶段、配置阶段、执行阶段。

  1. 初始化阶段

    settings.gradle发起,确定每一个build.gradle,也就是与之对应的Project实例,最终形成一个项目的层次结构。而一个settings.gradle脚本对应的是Settings对象

    // org.gradle.api.initialization
    public interface Settings extends PluginAware,ExtensionAware{
        String DEFAULT_SETTINGS_FILE = "settings.gradle";
        ...
        Gradle getGradle();
        ...
    }
    
    // settings.gradle
    // 在 Gradle 的构建过程中添加各个生命周期节点监听
    gradle.addBuildListener(new BuildListener(){
        //...
    })
    
  2. 配置阶段

    执行各module下的build.gradle,完成project的配置,同时会构造Task的任务依赖关系,该阶段的代码通常包含3个部分:build.gradle、闭包、Task中的配置语句。另外执行任何gradle命令,初始化阶段和配置阶段的代码都会被执行

  3. 执行阶段

    根据各Task依赖关系创建一个有向无环图,可以通过gradle.getTaskGraph()来获取

2. Project

每一个build.gradle脚本都会被编译器编译成 Project ,所以我们在 build.gradle 中所写的一切逻辑都是 Project 类内进行的

2.1 常用 project API

  1. getAllprojects:获取所有 project 的实例

  2. getSubprojects:表示获取当前工程下所有子工程的实例

  3. getRootProject:在任意 build.gradle 文件获取当前根目录 project 实例

  4. project:表示的是指定工程的实例,然后在闭包中对其进行操作

  5. allprojects:配置当前 project 及其旗下的每一个子 project

  6. subprojects:配置当前 project 下的所有子 project

    // root -> build.gradle
    def getSubProjects(){
         println("========== start ================")
        def it = getAllprojects().iterator()
        it.forEachRemaining({
            println("it:$it")
        })
    
        println ''
        def it2 = getSubprojects().iterator()
        it2.forEachRemaining({
            println("it:$it")
        })
    
        println ""
        def rootProjectName = getRootProject().name
        println "rootProject:$rootProjectName"
    
        println ""
        project("app"){
            println "it:$it"
        }
    
        println ''
        allprojects {
            repositories {
                println 'maven  mavenCentral'
            }
        }
    
        println ''
        subprojects {
            println 'subprojects'
        }
        println("========== end ================")
    }
    
    getSubProjects()
    /*
    通过执行gradlew clean命令验证
    > Configure project :
    ========== start ================
    it:root project 'timer'
    it:project ':app'
    
    it:project ':app'
    
    rootProject:timer
    
    it:project ':app'
    
    maven  mavenCentral
    maven  mavenCentral
    ========== end ================
    */
    

2.2 project 属性

一共有7个,但是 gradle 给我们提供 ext关键字自定义扩展属性

// org.gradle.api
public interface Project extends Comparable<Project>,ExtensionAware,PluginAware{
    String DEFAULT_BUILD_FILE = "build.gradle";
    String PATH_SEPARATOR = ":";
    String DEFAULT_BUILD_DIR_NAME = "build";
    String GRADLE_PROPERTIES = "gradle.properties";
    String SYSTEM_PROP_PREFIX = "systemProp";
    String DEFAULT_VERSION = "unspecified";
    String DEFAULT_STATUS = "release";
    ...
}

ext 自定义扩展属性

ext {
    compileV = 5
    version = [
            compileV  : 27,
            buildToolV: "28.0.3"
    ]
}

def getProjects() {
    println("========== start ================")

    println "${ext.compileV}"
    println "${ext.version.compileV}"

    ext.version.each { k, v ->
        println "$k - $v"
    }
    
    println("========== end ================")
}
/*
通过执行gradlew clean命令验证
> Configure project :
========== start ================
5
27
compileV - 27
buildToolV - 28.0.3
========== end ================
*/

还有一种实际用处,可以参考链接中的 6、更加智能化的现在,使用方法调用的形式做依赖;

另外还可以在 gradle.properties下自定义扩展属性,对于其它 gradle 文件可以全局引用这类属性

// gradle.properties
mCompileVersion=27

// root-> build.gradle
def test(){
    println mCompileVersion
}

2.3 文件相关 API

在 gradle 中,文件相关 API 可以总结为两类:路径获取、文件操作

// root -> build.gradle, 路径获取
def path(){
    println "${rootDir.absolutePath}"
    println "${buildDir.absolutePath}"
    println "${projectDir.absolutePath}"
}
/*
> Configure project :
F:\gitlab\timer
F:\gitlab\timer\build
F:\gitlab\timer

如果是 app -> build.gralde,则输出为:
> Configure project :app
F:\gitlab\timer
F:\gitlab\timer\app\build
F:\gitlab\timer\app
*/

输出文件内容 file.text

def test(){
    def mFile = file("config.gradle")
    // groovy-3.0.7.jar\org\codehaus\groovy\runtime\ResourceGroovyMethods.getText(File fie)
    println mFile.text
}
/*
> Configure project :
ext {
    android = [
            applicationId: "com.monk.timer.test",
            innerVersion : "KA",
            versionCode  : 7,
            versionName  : "v0.1.2"
    ]
}
*/

文件拷贝

copy {
    println 'copy start '
    // 既可以拷贝文件,也可以拷贝文件夹
    from file("config.gradle")
    into "univ"
    exclude {
        // 排除不需要拷贝的文件
    }
    rename {
        // 对拷贝过来的文件进行重命
        "test.gradle"
    }
    println 'copy end '
}
/*
univ
- test.gradle
*/

遍历文件

fileTree("gradle/wrapper"){
    it.visit {FileTreeElement fileTreeElement ->
        println("${fileTreeElement.file.name}")
    }
}
/*
> Configure project :
gradle-wrapper.jar
gradle-wrapper.properties
*/

2.4 其它API

buildScript:配置项目核心依赖

// root -> build.gradle
// 我们平时见到的都是简化过的版本,以下是未简化版本
buildscript {RepositoryHandler it->
    it.google()
    it.mavenCentral()

    // 访问本地私有maven库
    it.maven {
        name "personal"
        url "http://localhost:80800:/xx/repositories"
        credentials{
            username("monk")
            password("123456")
        }
    }
    dependencies {DependencyHandler dh ->
        // 配置 gradle 工程的插件依赖
        dh.classpath "com.android.tools.build:gradle:7.0.2"
    }
}

app/build.gradle/dependencies:为应用程序添加三方依赖,而根目录下的dependencies是用来配置gradle 插件依赖

// app -> build.gradle
dependencies {
    implementation("com.github.bumptech.glide:glide:4.14.2"){
        exclude module: 'support-v4'
        // 关闭传递依赖,默认也是关闭
        transitive false
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值