Gradle 指南之從 Groovy 遷移到 Kotlin

前言

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

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

準(zhǔn)備工作

  1. 確認你的 IDE 是否最新版本,如不是,請升級到最新版本,本文是基于 Android Studio 3.1.4 版本進行的遷移

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

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

開始遷移

步驟一. 升級 Gradle 4.10,建議通過以下命令進行升級:

./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

確認 sync 成功后,接下來就可以正式進行 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 進行重寫,以我的操作路徑為例(不同操作路徑,可能遇到的問題不一樣):

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?,F(xiàn)在直接可以愉快的用 Kotlin 去寫 Gradle 構(gòu)建腳本了。

示例 Demo

參考資料:

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

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

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

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