使用 Kotlin DSL 進(jìn)行依賴管理

有很多關(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 BalintKotlin 的 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惋嚎、releaseproduction.

實(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)目

  1. 創(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末飒箭,一起剝皮案震驚了整個(gè)濱河市狼电,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌弦蹂,老刑警劉巖肩碟,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凸椿,居然都是意外死亡削祈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門脑漫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來髓抑,“玉大人,你說我怎么就攤上這事优幸《峙模” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵网杆,是天一觀的道長羹饰。 經(jīng)常有香客問我伊滋,道長,這世上最難降的妖魔是什么队秩? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任笑旺,我火速辦了婚禮,結(jié)果婚禮上馍资,老公的妹妹穿的比我還像新娘燥撞。我一直安慰自己,他們只是感情好迷帜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布物舒。 她就那樣靜靜地躺著,像睡著了一般戏锹。 火紅的嫁衣襯著肌膚如雪冠胯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天锦针,我揣著相機(jī)與錄音荠察,去河邊找鬼。 笑死奈搜,一個(gè)胖子當(dāng)著我的面吹牛悉盆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播馋吗,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼焕盟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宏粤?” 一聲冷哼從身側(cè)響起脚翘,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绍哎,沒想到半個(gè)月后来农,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡崇堰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年沃于,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片海诲。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡繁莹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饿肺,到底是詐尸還是另有隱情蒋困,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布敬辣,位于F島的核電站雪标,受9級特大地震影響零院,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜村刨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一告抄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嵌牺,春花似錦打洼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至僻弹,卻和暖如春阿浓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蹋绽。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工芭毙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卸耘。 一個(gè)月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓退敦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蚣抗。 傳聞我的和親對象是個(gè)殘疾皇子侈百,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348