Gradle 指南之從 Groovy 遷移到 Kotlin

前言

最近寫 Kotlin 寫的有些著魔了,正好看到 Gradle 4.10 版本支持使用 Kotlin DSL 構(gòu)建腳本慌植,然后心血來潮的嘗鮮了下甚牲,因為剛出來,相關(guān)的資料實在太少蝶柿,實際在遷移過程遇到不少問題丈钙,所以本文可能是第一篇非官方遷移指導(dǎo)文檔,希望可以 save your time !

好了交汤,話不多說雏赦,馬上開始遷移(踩坑)之旅

準(zhǔn)備工作

  1. 確認(rèn)你的 IDE 是否最新版本,如不是芙扎,請升級到最新版本星岗,本文是基于 Android Studio 3.1.4 版本進(jìn)行的遷移

  2. 遷移過程可能會出現(xiàn)一些意想不到的坑,建議找個空閑時間戒洼,買杯咖啡俏橘,然后做好......和丫死磕的準(zhǔn)備 :)

不建議在實際項目中直接遷移,畢竟對于 Kotlin 的支持剛出來圈浇,還不太穩(wěn)定寥掐,可以拉個分支或者弄個Demo工程體驗一下。

開始遷移

步驟一. 升級 Gradle 4.10磷蜀,建議通過以下命令進(jìn)行升級:

./gradlew wrapper --gradle-version=4.10

需要等待一段下載時間召耘,更新完成后,點擊 sync 按鈕褐隆,好了污它,不出意外,這里會遇到第一個問題庶弃,如下圖:


image

我們看下異常描述

Configuration on demand is not supported by the current version of the Android Gradle plugin since you are using Gradle version 4.6 or above. Suggestion: disable configuration on demand by setting org.gradle.configureondemand=false in your gradle.properties file or use a Gradle version less than 4.6.

簡單來講衫贬,Android Gradle 插件不支持基于新版本的 Gradle 的按需配置,異常描述里也提供兩個解決辦法:

  1. gradle.properties 增加 org.gradle.configureondemand=false 設(shè)置
  2. 使用低于 Gradle 4.6 以下的版本

ok歇攻,首先降版本的方案肯定被 pass 了固惯,那就在我們項目的 gradle.properties 加上一段配置貌似就可以了,大功告成掉伏,so easy ~

too navie缝呕,當(dāng)你加上這段配置后,你會發(fā)現(xiàn)仍舊無法通過編譯斧散,錯誤依舊供常,為此,我專門檢查了好幾遍是不是少了個字母之類的鸡捐,顯然和這個沒有一毛錢關(guān)系栈暇,這里不應(yīng)該質(zhì)疑自己作為一名 CV 戰(zhàn)士的專業(yè)性。

其實是被異常描述里給誤導(dǎo)了箍镜,至少我直覺上是直接去修改工程里的 gradle.properties 源祈,實際上,你需要修改的是 ${HOME}/.gradle/gradle.properties色迂,當(dāng)然也有更簡單的方式香缺,如圖:

image

更多信息可以看這個回答:configuration-on-demand-is-not-supported

確認(rèn) sync 成功后,接下來就可以正式進(jìn)行 Kotlin DSL 遷移了

步驟二. 使用 Kotlin 重寫 Groovy

需要注意的地方是:

  • Groovy DSL script files use the .gradle file name extension.
  • Kotlin DSL script files use the .gradle.kts file name extension.

這里歇僧,我直接對原有的 build.gradle 腳本通過重命名的方式图张,修改為 build.gradle.kts 的后綴名,可能會提示有沖突诈悍,這里不用管祸轮,直接點擊 continu,然后你會發(fā)現(xiàn)腳本里一片飆紅侥钳,不用擔(dān)心适袜,之前的 Groovy 語法在 Kotlin 報錯了而已,推薦全部刪掉舷夺,然后對照著用 Kotlin 重新寫一遍苦酱,這樣,會印象深刻一些冕房。

這里以一個比較簡單的示例工程說明一下:

image

我們分別對根目錄的 settting.gradlebuild.gradle 以及 app 目錄下的 build.gradle 進(jìn)行重寫躏啰,以我的操作路徑為例(不同操作路徑,可能遇到的問題不一樣):

app/build.gradle -> setting.gradle -> build.gradle

說下幾個需要注意的地方:

需要說明的一點耙册,目前 Gradle 官方是支持 Groovy 腳本和 Kotlin 并存的给僵,雖然我感覺支持的并不太好

1. android 配置項無法自動被識別出來,如圖所示:

image

解決辦法:不用管详拙,直接寫一個配置項出來帝际,然后 sync 同步一下就可以了,如圖:

image

2. signconfig release 配置變更

signingConfigs {
    create("release") {
        storeFile = file("your keystore path")
        storePassword = "your password"
        keyAlias = "your alias"
        keyPassword = "your password"
    }
    getByName("debug") {
        storeFile = file("your keystore path")
        storePassword = "your password"
        keyAlias = "your alias"
        keyPassword = "your password"
    }
}

3. 重命名生成的 apk 文件名

大部分開發(fā)當(dāng)中應(yīng)該都會有對輸出的 apk 有重命名的需求饶辙,原來我在 Groovy 中是通過:

applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "${flavors}@app_$versionName}.apk"
    }
}

遷移到 Kotlin 發(fā)現(xiàn)無法直接使用 outputFileName 的屬性了

解決辦法:顯式轉(zhuǎn)為具體實現(xiàn)類

android.applicationVariants.all {
    outputs.all {
        if (this is ApkVariantOutputImpl) {
            this.outputFileName = "$flavors@app_$versionName.apk"
        }
    }
}

4. setting.gradle 配置指定 build.gradle.kts

    rootProject.buildFileName = "build.gradle.kts"

    include("app")

好了蹲诀,如果你沒遇到其他問題的話,到這里基本就已經(jīng)大功告成了弃揽!

另外脯爪,本文的示例工程我已經(jīng)放到 GitHub 上了则北,各位感興趣的可以去看下~

總結(jié)

首先對于 Gradle 這么快就支持 Kotlin DSL,我還是感到很驚喜的痕慢,其實尚揣,費了不少時間這么折騰了一下,實際上掖举,如果一定要說作用的話快骗,可能確實沒有什么作用。

但是塔次,我覺得好處還是要說一說的方篮,對于使用 Kotlin 開發(fā)的小伙伴來說,首先開發(fā)語言和構(gòu)建語言統(tǒng)一了励负,之前想寫構(gòu)建腳本藕溅,還需要去學(xué)習(xí) Groovy。現(xiàn)在直接可以愉快的用 Kotlin 去寫 Gradle 構(gòu)建腳本了继榆。

示例 Demo

參考資料:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蜈垮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子裕照,更是在濱河造成了極大的恐慌攒发,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晋南,死亡現(xiàn)場離奇詭異惠猿,居然都是意外死亡,警方通過查閱死者的電腦和手機负间,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門偶妖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人政溃,你說我怎么就攤上這事趾访。” “怎么了董虱?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵扼鞋,是天一觀的道長。 經(jīng)常有香客問我愤诱,道長云头,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任淫半,我火速辦了婚禮溃槐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘科吭。我一直安慰自己昏滴,他們只是感情好猴鲫,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谣殊,像睡著了一般变隔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蟹倾,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音猖闪,去河邊找鬼鲜棠。 笑死,一個胖子當(dāng)著我的面吹牛培慌,可吹牛的內(nèi)容都是我干的豁陆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼俘闯,長吁一口氣:“原來是場噩夢啊……” “哼魁莉!你這毒婦竟也來了宏悦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤祥诽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瓮恭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雄坪,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年屯蹦,在試婚紗的時候發(fā)現(xiàn)自己被綠了维哈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡登澜,死狀恐怖阔挠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脑蠕,我是刑警寧澤购撼,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站谴仙,受9級特大地震影響份招,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜狞甚,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一锁摔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哼审,春花似錦谐腰、人聲如沸孕豹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽励背。三九已至,卻和暖如春砸西,著一層夾襖步出監(jiān)牢的瞬間叶眉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工芹枷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留衅疙,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓鸳慈,卻偏偏與公主長得像饱溢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子走芋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于為何要使用Kotlin DSL來編寫Gradle構(gòu)建腳本大家可以看看這篇文章Kotlin Meets Grad...
    Acker飏閱讀 2,748評論 2 4
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理绩郎,服務(wù)發(fā)現(xiàn),斷路器翁逞,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評論 6 342
  • 說明 本文主要介紹和Gradle關(guān)系密切肋杖、相對不容易理解的配置,偏重概念介紹挖函。部分內(nèi)容是Android特有的(例如...
    jzj1993閱讀 15,577評論 1 62
  • 1.今日刻意實踐 經(jīng)實驗兽愤,三個制作日清單的時間中,我用的最順手的是碎片化時間挪圾。因為浅萧,晚上在家的時間有很多家事處理,...
    Shirley雪之聲閱讀 113評論 1 1