有很多關(guān)于如何配置項(xiàng)目以使用 Kotlin DSL 的內(nèi)容铝噩。我找不到能夠廣泛解釋正在發(fā)生的事情以及我們正在做的事情背后的基本原則的內(nèi)容,特別是對于那些正在職業(yè)發(fā)展并想要了解整個(gè)事情的人惫谤。本章的重點(diǎn)是為什么從我們的 Github 項(xiàng)目中獲取一些快照。我們需要了解很多信息患雏,包括構(gòu)建過程或渤、特定領(lǐng)域的語言、各種配置等等。我將專注于關(guān)鍵概念绢记,以及它們?nèi)绾蜗嗷リP(guān)聯(lián)扁达。
目標(biāo)
理論
- Grandle 和 Android 構(gòu)建過程
- 用于依賴管理的 DSL 和 Kotlin DSL
動(dòng)手
- 為 Android 項(xiàng)目設(shè)置 Kotlin DSL
- 使用 Kotlin DSL 管理依賴項(xiàng)
Gradle 和 Android 構(gòu)建過程
Gradle
大多數(shù)項(xiàng)目涉及多個(gè)協(xié)同工作的工件和資源。然后將工件構(gòu)建到在特定環(huán)境中運(yùn)行的應(yīng)用程序中庭惜。Gradle 是一個(gè)構(gòu)建自動(dòng)化工具罩驻,可以自動(dòng)化軟件構(gòu)建過程穗酥,例如
- 編譯
- 建造
- 打包
- 測試
- 部署到各種平臺(tái)护赊。
除此之外,它確保了構(gòu)建過程中的高速性能和一致性砾跃,同時(shí)還允許開發(fā)人員自定義應(yīng)用程序骏啰。
Gradle 致力于三個(gè)概念
- 項(xiàng)目 - 需要完成的工作,例如編譯和部署抽高。
- 任務(wù) - 構(gòu)建過程中的單個(gè)活動(dòng)判耕,例如創(chuàng)建 JAR 文件。
- 構(gòu)建腳本 - 位于項(xiàng)目/模塊根目錄的文件翘骂,包含 Gradle 執(zhí)行每個(gè)任務(wù)所需的工件壁熄。
Gradle 有一個(gè)非常強(qiáng)大的文檔,你可以查看它碳竟。它用于大多數(shù) Android 項(xiàng)目草丧。
Android 構(gòu)建過程
我們在 Android Studio 上編寫的 Kotlin/Java 代碼被轉(zhuǎn)換為可以在不同的 android 設(shè)備上運(yùn)行的版本。Gradle 是 Android 應(yīng)用程序的構(gòu)建工具莹桅。它使我們不想擔(dān)心的事情自動(dòng)化昌执。Gradle 和 android 插件構(gòu)成了 android 構(gòu)建系統(tǒng),使您可以輕松地構(gòu)建獨(dú)立于平臺(tái)的項(xiàng)目诈泼,即您可以在 Android Studio懂拾、終端或遠(yuǎn)程服務(wù)器上構(gòu)建。
下圖改編自 Android 開發(fā)者網(wǎng)站铐达,展示了構(gòu)建過程岖赋。
構(gòu)建 android 應(yīng)用程序的大局是將應(yīng)用程序構(gòu)建到您簽署和發(fā)布或測試的應(yīng)用程序包 (AAB) 或應(yīng)用程序包 (APK) 中。構(gòu)建過程分三個(gè)階段進(jìn)行
- 源代碼被轉(zhuǎn)換為 DEX 文件瓮孙。Android 運(yùn)行時(shí)使用 ART贾节、JIT、AOT 或 Dalvik 運(yùn)行時(shí)衷畦。您可以從本文或官方文檔中了解有關(guān)Android 運(yùn)行時(shí)的更多信息
- 該應(yīng)用程序被打包成 APK 或 AAB栗涂。我們在項(xiàng)目級構(gòu)建 Gradle 中至少指定一種構(gòu)建類型。
- 簽名 - 打包程序使用所選的構(gòu)建變體對應(yīng)用程序進(jìn)行簽名祈争。然后針對發(fā)布進(jìn)行優(yōu)化斤程。
Gradle 使我們能夠自定義應(yīng)用程序的配置。這就是在項(xiàng)目中使用 Grade 的美妙之處。我們有余地以一種易于擴(kuò)展項(xiàng)目的方式配置我們的依賴項(xiàng)忿墅。 用于依賴管理的 Gradle有關(guān)于依賴如何工作的強(qiáng)大文檔扁藕,以幫助我們弄清楚如何有效地管理依賴。我們將探討 Gradle 依賴管理的幾個(gè)方面疚脐。
Android 項(xiàng)目依賴于各種庫和模塊配置亿柑,需要適當(dāng)?shù)墓芾怼radle 在大多數(shù) JVM 項(xiàng)目中使用 Groovy DSL 來自動(dòng)化依賴管理棍弄。DSL 有一個(gè)內(nèi)置的依賴管理過程望薄,它會(huì)自動(dòng)知道如何根據(jù)需要下載和提供依賴。但是呼畸,您需要聲明依賴項(xiàng)以告訴 Gradle 從何處獲取構(gòu)建的依賴項(xiàng)痕支。
您可以使用公共或私有存儲(chǔ)庫。我們用于 android 項(xiàng)目的兩個(gè)常見公共存儲(chǔ)庫是 mavenCental 和 google 用于 Android 項(xiàng)目蛮原。根據(jù)組織偏好卧须,還有其他幾種聲明依賴關(guān)系的方法。例如儒陨,如果您的依賴項(xiàng)位于文件目錄中花嘶,則將資源定義為flatDir
對象并使用dirs("lib")
. 你也可以擁有一個(gè)mavenLocal
如果您對 Groovy 沒問題,本教程是可選的蹦漠。然而椭员,大多數(shù)組織正在轉(zhuǎn)向 Kotlin DSL 進(jìn)行依賴管理。但什么是 DSL津辩?
DSL
設(shè)計(jì)特定語言 (DSL) 是一種設(shè)計(jì)模式拆撼,它試圖使代碼具有表達(dá)性和流暢性,以便任何人都可以理解代碼喘沿。DSL 本身就是一種編程語言闸度,它提供更高級別的抽象來解決特定問題。在大多數(shù)場景中蚜印,我們使用 DSL 進(jìn)行配置莺禁,因?yàn)樗菀桌斫狻Mㄟ^使用 DSL窄赋,您可以獲得以下優(yōu)勢
- 揭示意圖 - 您知道代碼開箱即用的功能哟冬。我們希望花最少的時(shí)間在配置上,而將更多的時(shí)間花在解決我們的具體問題上忆绰。揭示意圖使其更接近我們想要對代碼執(zhí)行的操作
- 一致性——我們希望我們的生產(chǎn)版本控制是集中的和一致的浩峡。Kotlin DSL 為我們提供了所有依賴項(xiàng)和版本的中心位置。
- Fluency - Kotlin DSL 更加流暢错敢,在 Kotlin 中很容易表達(dá)翰灾。
- 我們還希望刪除重復(fù)項(xiàng),同時(shí)使用最少的代碼行。
但是 DSL 并不局限于依賴管理纸淮。請記住 DSL 是一種設(shè)計(jì)模式平斩,通常遵循面向語言的編程,重點(diǎn)是使代碼優(yōu)化并且即使對于非程序員也可讀咽块。CSS 是 DSL 的一個(gè)示例绘面,它廣泛用于設(shè)置 UI 元素的樣式。但這超出了本教程的范圍侈沪。您可以通過Tino Balint或Kotlin 的 12 天中的這個(gè)示例檢查使用 DSL 和Lambdas
了解 Groovy DSL
對于希望通過 Groovy DSL 使用 Kotlin DSL 的開發(fā)人員來說爬骤,使用 Kotlin DSL 是可選的赌蔑。Kotlin DSL 具有許多優(yōu)點(diǎn)蝗柔。
讓我們偏離一下绝页,看看 Groovy DSL 的主要組件
Android 構(gòu)建系統(tǒng)的工作原理
我發(fā)現(xiàn)了解構(gòu)建過程如何在幕后工作將有助于我們自定義構(gòu)建過程晃虫。該settings.gradle
文件用于列出應(yīng)用程序中的所有模塊皆撩。對于我們的案例,我們有 3 個(gè)模塊哲银,應(yīng)用程序扛吞、域和數(shù)據(jù)模塊。
Gradle 插件知道如何構(gòu)建您的項(xiàng)目荆责,具體取決于您使用的依賴項(xiàng)滥比。例如,如果你想將一個(gè)應(yīng)用程序編譯成一個(gè) android 應(yīng)用程序做院,我們使用 android 插件盲泛。
Gradle 通過使用任務(wù)進(jìn)行操作,這些任務(wù)根據(jù)規(guī)范接受輸入键耕、處理和輸出寺滚。Gradle 使用等級 DSL 進(jìn)行配置。更改為 Kotlin DSL 很重要屈雄,因?yàn)檫@是大多數(shù)公司使用的村视。
Gradle 在項(xiàng)目級文件中解析 Gradle DSL并構(gòu)建 AGP DSL 對象,build.gradle
例如BuildType``ApplicationExtension
該android.application
插件附帶其 DSL 來配置應(yīng)用程序?qū)傩跃颇蹋梢栽谄渲信渲?code>android特定的構(gòu)建參數(shù)蚁孔,如 SDK 版本、應(yīng)用程序詳細(xì)信息以及不同構(gòu)建類型(如debug
惋嚎、release
和production
.
實(shí)際操作
將依賴項(xiàng)從 Groovy 轉(zhuǎn)換為 Kotlin
讓我們真正了解我們正在做的事情杠氢。從之前的教程中,我們有了多模塊應(yīng)用程序的骨架另伍。
Kotlin 和 Groovy DSL 在我們?nèi)绾温暶鞴ぜ矫娣浅2煌前佟D枰⒁獾囊恍╆P(guān)鍵事項(xiàng)是:
Groovy 使用單引號,就像
classpath 'com.android.tools.build:gradle:7.0.3'
Kotlin 需要雙引號,即classpath ("com.android.tools.build:gradle:7.0.4")
在 Groovy 中愕宋,buildTypes 是明確聲明的玻靡,比如
但是在 Kotlin 中,大多數(shù)常見的 buidTypes 在默認(rèn)情況下都是可用的中贝,因此隱式定義如下
為 Kotlin DSL 設(shè)置項(xiàng)目
- 創(chuàng)建 buildSrc 轉(zhuǎn)到項(xiàng)目的根目錄囤捻,與數(shù)據(jù)、域和表示模塊處于同一級別邻寿,并將其命名為 buildSrc蝎土。
在項(xiàng)目視圖上,Right Click Github突出顯示New然后Directory命名buildSrc
buildSrc 將包含您項(xiàng)目的構(gòu)建信息绣否。正是在這個(gè)文件中誊涯,我們告訴項(xiàng)目使用 Kotlin DSL。該文件夾還將包含我們可以在不同模塊之間共享的信息蒜撮,例如版本和庫暴构。它抽象了命令式邏輯并幫助我們維護(hù)復(fù)雜的構(gòu)建邏輯。
當(dāng) Gradle 發(fā)現(xiàn) buildSrc 文件夾時(shí)段磨,它會(huì)自動(dòng)將該文件夾添加到 build 文件夾中取逾,對該文件夾進(jìn)行編譯和測試,并將其添加到 build 腳本所在的類路徑中苹支。它給了我們幫助
有一個(gè)專用文件來聲明依賴項(xiàng)
輕松重構(gòu)依賴關(guān)系
輕松測試依賴關(guān)系
從一個(gè)地方維護(hù)依賴關(guān)系
啟用 Kotlin DSL 要實(shí)現(xiàn)上述目的砾隅,我們需要啟用 Kotlin DSL。在 buildSrc 的根目錄下創(chuàng)建一個(gè)文件并將其命名build.gradle.kts如下所示债蜜。
構(gòu)建項(xiàng)目晴埂。
如果您是第一次從 Groovy DSL 遷移到 Kotlin DSL,請確保每次進(jìn)行更改時(shí)都構(gòu)建項(xiàng)目寻定。
此時(shí)儒洛,Gradle 知道我們將使用 Kotlin 進(jìn)行依賴管理。
將文件從 Groovy 轉(zhuǎn)換為 Kotlin
在開始向文件添加更多依賴項(xiàng)之前特姐,我們需要更改現(xiàn)有文件
settings.gradle
- 將文件重命名settings.gradle為settings.gradle.kts
- 用雙引號替換單引號并添加括號晶丘。
- 構(gòu)建項(xiàng)目。
最終的設(shè)置文件將如圖所示唐含。
項(xiàng)目級 Gradle 構(gòu)建
- 將文件名重命名build.gradle為build.gradle.kts
- 用雙引號替換單引號并添加括號如圖
- 同步并構(gòu)建項(xiàng)目
- 編輯任務(wù)寄存器浅浮。
- 確保所有 URL 如下所示
模塊級 Gradle
演示插件
- 將文件名從 更改build.gradle為build.gradle.kts
- 用雙引號替換單引號并添加括號如圖
Android
- 將值更改為函數(shù),將字符串更改為屬性調(diào)用
- 對于函數(shù)捷枯,將它們添加到括號中滚秩,對于值,使用等號
構(gòu)建類型
- 某些構(gòu)建類型默認(rèn)可用淮捆,例如發(fā)布和調(diào)試
- 對于 minify郁油,我們調(diào)用isMinifyEnabled函數(shù)
- 對于 Proguard本股,我們調(diào)用getDefaultProguardFile函數(shù)
添加如下圖
更新域和數(shù)據(jù)模塊。
確保每次更改文件后項(xiàng)目都能編譯桐腌。
集中依賴關(guān)系
現(xiàn)在我們已經(jīng)成功遷移到 Kotlin拄显,下一步是集中依賴和版本。我們還將添加項(xiàng)目所需的大部分依賴項(xiàng)案站。
您可以將該項(xiàng)目用作項(xiàng)目的模板躬审。
在 buildSrc 文件夾中創(chuàng)建一個(gè) Kotlin 目錄。轉(zhuǎn)到New=> Directory=>src/main/kotlin
在新目錄中創(chuàng)建四個(gè) Kotlin 對象文件蟆盐。在這里承边,您可以選擇如何組織文件。就我而言石挂,我有四個(gè)文件
- Config.kt包含主要配置信息的文件博助,如構(gòu)建插件、android 工件版本痹愚、Gradle 插件和構(gòu)建類型富岳。
- Versions.kt文件,其中包含項(xiàng)目中所有庫和依賴項(xiàng)的版本里伯。為簡單起見城瞎,我省略了大部分依賴項(xiàng)和版本渤闷。
- Modules.kt包含模塊的文件
- Dependencies.kt它具有項(xiàng)目的所有庫依賴項(xiàng)疾瓮。
現(xiàn)在更新 Gradle 文件以使用 buildConfig 文件夾中的依賴項(xiàng)和配置文件。
項(xiàng)目級配置變?yōu)?/p>
演示級插件
這些是一些依賴項(xiàng)
來源:https://ciox.hashnode.dev/dependency-management-using-kotlin-dsl