美文网首页app应用开发框架AndroidGradle
Gradle 之统一管理依赖(kotlin+buildSrc)

Gradle 之统一管理依赖(kotlin+buildSrc)

作者: tandeneck | 来源:发表于2021-03-27 15:51 被阅读0次

    背景

    随着项目越来越大,module 越来越多,依赖的库也越来越多,依赖管理也越来越混乱。

    管理 Gradle 依赖三板斧

    一、原始粗暴式

    module/build.gradle 直接引入,就像下面一样:

    plugins {
        id 'com.android.library'
        id 'kotlin-android'
    }
    
    android {
        compileSdkVersion 30
        buildToolsVersion "30.0.2"
    
        defaultConfig {
            minSdkVersion 21
            targetSdkVersion 30
            versionCode 1
            versionName "1.0.0"
            ...
        }
        ...
    }
    
    dependencies {
    
        implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
        implementation 'androidx.core:core-ktx:1.3.2'
    
        implementation 'androidx.appcompat:appcompat:1.2.0'
        implementation 'com.google.android.material:material:1.3.0'
    
        implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    }
    

    方便快捷,依赖的时候 gtihub 上复制粘贴一气呵成,我们在这里就不讨论重复配置的问题了,只是如果需要进行版本升级的时候大家就知道这样写的酸爽了。

    二、ext 进化式

    Gradle 提供了 ext 关键字可以让我们去定义自身所需要的扩展属性。说白话就是我们可以通过 ext 关键字对我们工程中的依赖进行全局配置。

    1. 直接在根目录下的 build.gradle 中编写 ext
    ext {
        versions = [
                compileSdkVersion: 30,
                buildToolsVersion: "30.0.2",
                minSdkVersion    : 21,
                targetSdkVersion : 30,
                versionCode      : 1,
                versionName      : "1.0.0",
    
                kotlin_version: "1.4.30",
                core_ktx      : "1.3.2",
                appcompat     : "1.2.0",
                material      : "1.3.0",
                retrofit      : "2.9.0"
        ]
    
        libs = [
                kotlin_stdlib: "org.jetbrains.kotlin:kotlin-stdlib:${versions.kotlin_version}",
                core_ktx:"androidx.core:core-ktx:1.3.2:${versions.core_ktx}",
                appcompat:"androidx.appcompat:appcompat:${versions.appcompat}",
                material:"com.google.android.material:material:${versions.material}",
                retrofit:"com.squareup.retrofit2:retrofit:${versions.retrofit}"
        ]
    }
    

    module 中的 build.gradle,如下:

    plugins {
        id 'com.android.library'
        id 'kotlin-android'
    }
    
    android {
        compileSdkVersion versions.compileSdkVersion
        buildToolsVersion versions.buildToolsVersion
    
        defaultConfig {
            minSdkVersion versions.minSdkVersion
            targetSdkVersion versions.targetSdkVersion
            versionCode versions.versionCode
            versionName versions.versionName
            ...
        }
        ...
    }
    
    dependencies {
    
        implementation libs.kotlin_stdlib
        implementation libs.core_ktx
        implementation libs.appcompat
        implementation libs.material
    
        implementation libs.retrofit
    }
    

    这样,所有的 module 需要更新依赖库的时候,去修改 ext 下的代码即可,当然,如果是新增的话,还要在 module 下进行依赖,这个不必多说。

    2. 在另一个 gradle 脚本中进行编写 ext

    随着依赖项越来越多,ext 中的代码也越来越庞大,为了更好地管理。我们会把代码写在一个 .gradle 文件中,一般在开源项目中是 config.gradle 或者 versions.gradle。以 config.gradle 为例(放在根目录下):


    • config.gradle
    ext {
        versions = [
                compileSdkVersion: 30,
                buildToolsVersion: "30.0.2",
                minSdkVersion    : 21,
                targetSdkVersion : 30,
                versionCode      : 1,
                versionName      : "1.0.0",
    
                kotlin_version: "1.4.30",
                core_ktx      : "1.3.2",
                appcompat     : "1.2.0",
                material      : "1.3.0",
                retrofit      : "2.9.0"
        ]
    
        libs = [
                kotlin_stdlib: "org.jetbrains.kotlin:kotlin-stdlib:${versions.kotlin_version}",
                core_ktx:"androidx.core:core-ktx:1.3.2:${versions.core_ktx}",
                appcompat:"androidx.appcompat:appcompat:${versions.appcompat}",
                material:"com.google.android.material:material:${versions.material}",
                retrofit:"com.squareup.retrofit2:retrofit:${versions.retrofit}"
        ]
    }
    
    • 在根目录的 build.gradle 文件中的头部加上 apply from: config.gradle
    • 在 module 中 build.gradle 应用依赖项,如下
        id 'com.android.library'
        id 'kotlin-android'
    }
    
    android {
        compileSdkVersion rootProject.ext.versions["compileSdkVersion"]
        buildToolsVersion rootProject.ext.versions["buildToolsVersion"]
    
        defaultConfig {
            minSdkVersion rootProject.ext.versions["minSdkVersion"]
            targetSdkVersion rootProject.ext.versions["targetSdkVersion"]
            versionCode rootProject.ext.versions["versionCode"]
            versionName rootProject.ext.versions["versionName"]
            ...
        }
        ...
    }
    
    dependencies {
    
        implementation rootProject.ext.libs["kotlin_stdlib"]
        implementation rootProject.ext.libs["core_ktx"]
        implementation rootProject.ext.libs["appcompat"]
        implementation rootProject.ext.libs["material"]
    
        implementation rootProject.ext.libs["retrofit"]
    }
    

    三、kotlin + buildSrc 式

    ext 可以帮我们很好地解决了管理依赖的问题,美中不足的是它不支持点击跳转、自动补全的问题。这就轮到 buildSrc 大显身手了。对于 buildSrc 写过 gradle 插件的同学都说好。

    运行 gradle 时,它首先会检查项目中是否存在一个叫 buildSrc 的目录,如果有的话,gradle 会自动编译并测试这段代码,并将其放入构建脚本的类路径中。

    1. 在根目录下创建 buildSrc 目录
    2. 新建文件 build.gradle.kts,并同步 gradle,如下:
    plugins {
        `kotlin-dsl`
    }
    repositories {
        jcenter()
    }
    
    3. 创建 /src/main/java/Dependencies.kt 文件,如下:
    4. 在 Dependencies.kt 文件中编写依赖管理代码,如下:
    object BuildVersion {
        const val compileSdk = 30
        const val buildTools = "30.0.2"
        const val minSdk = 21
        const val targetSdk = 30
        const val versionCode = 1
        const val versionName = "1.0.0"
    }
    
    object Versions {
        const val kotlin = "1.4.30"
        const val core_ktx = "1.3.2"
        const val appcompat = "1.2.0"
        const val material = "1.3.0"
        const val retrofit = "2.9.0"
    }
    
    object Libs {
        const val kotlin_stdlib = "org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlin}"
        const val core_ktx = "androidx.core:core-ktx:1.3.2:${Versions.core_ktx}"
        const val appcompat = "androidx.appcompat:appcompat:${Versions.appcompat}"
        const val material = "com.google.android.material:material:${Versions.material}"
        const val retrofit = "com.squareup.retrofit2:retrofit:${Versions.retrofit}"
    }
    
    
    5. 在 module 中 build.gradle 应用依赖项,如下
    plugins {
        id 'com.android.library'
        id 'kotlin-android'
    }
    
    android {
        compileSdkVersion BuildVersion.compileSdk
        buildToolsVersion BuildVersion.buildTools
    
        defaultConfig {
            minSdkVersion BuildVersion.minSdk
            targetSdkVersion BuildVersion.targetSdk
            versionCode BuildVersion.versionCode
            versionName BuildVersion.versionName
            ...
        }
    
        ...
    }
    
    dependencies {
    
        implementation Libs.kotlin_stdlib
        implementation Libs.core_ktx
        implementation Libs.appcompat
        implementation Libs.material
    
        implementation Libs.retrofit
    }
    

    参考

    相关文章

      网友评论

        本文标题:Gradle 之统一管理依赖(kotlin+buildSrc)

        本文链接:https://www.haomeiwen.com/subject/fovehltx.html