Gradle 之統(tǒng)一管理依賴(kotlin+buildSrc)

背景

隨著項(xiàng)目越來(lái)越大,module 越來(lái)越多,依賴的庫(kù)也越來(lái)越多,依賴管理也越來(lái)越混亂。

管理 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'
}

方便快捷,依賴的時(shí)候 gtihub 上復(fù)制粘貼一氣呵成,我們?cè)谶@里就不討論重復(fù)配置的問(wèn)題了,只是如果需要進(jìn)行版本升級(jí)的時(shí)候大家就知道這樣寫(xiě)的酸爽了。

二、ext 進(jìn)化式

Gradle 提供了 ext 關(guān)鍵字可以讓我們?nèi)ザx自身所需要的擴(kuò)展屬性。說(shuō)白話就是我們可以通過(guò) ext 關(guān)鍵字對(duì)我們工程中的依賴進(jìn)行全局配置。

1. 直接在根目錄下的 build.gradle 中編寫(xiě) 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 需要更新依賴庫(kù)的時(shí)候,去修改 ext 下的代碼即可,當(dāng)然,如果是新增的話,還要在 module 下進(jìn)行依賴,這個(gè)不必多說(shuō)。

2. 在另一個(gè) gradle 腳本中進(jìn)行編寫(xiě) ext

隨著依賴項(xiàng)越來(lái)越多,ext 中的代碼也越來(lái)越龐大,為了更好地管理。我們會(huì)把代碼寫(xiě)在一個(gè) .gradle 文件中,一般在開(kāi)源項(xiàng)目中是 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 應(yīng)用依賴項(xiàng),如下
    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 可以幫我們很好地解決了管理依賴的問(wèn)題,美中不足的是它不支持點(diǎn)擊跳轉(zhuǎn)、自動(dòng)補(bǔ)全的問(wèn)題。這就輪到 buildSrc 大顯身手了。對(duì)于 buildSrc 寫(xiě)過(guò) gradle 插件的同學(xué)都說(shuō)好。

運(yùn)行 gradle 時(shí),它首先會(huì)檢查項(xiàng)目中是否存在一個(gè)叫 buildSrc 的目錄,如果有的話,gradle 會(huì)自動(dòng)編譯并測(cè)試這段代碼,并將其放入構(gòu)建腳本的類路徑中。

1. 在根目錄下創(chuàng)建 buildSrc 目錄
2. 新建文件 build.gradle.kts,并同步 gradle,如下:
plugins {
    `kotlin-dsl`
}
repositories {
    jcenter()
}
3. 創(chuàng)建 /src/main/java/Dependencies.kt 文件,如下:
4. 在 Dependencies.kt 文件中編寫(xiě)依賴管理代碼,如下:
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 應(yīng)用依賴項(xiàng),如下
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
}

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容