如果你是 Android 開發者,相信你一定知道 build.gradle 就是一個用來宣告 dependency、設定支援版本、proguard 等雜七雜八跟專案環境有關的設定檔,但 build.gradle.kts 是什麼呢?
Gradle 是基於 Groovy 的一套 DSL,在 Java 生態系的開發中算是蠻熱門的 build tool,跟 XML-based 的 build tool 比起來相對簡潔易懂,所以在 Android 開發中算是最熱門的選項了。
而 KTS 是 Kotlin Scrip 的簡稱,我們知道 Kotlin 跟 Java 一樣,是一門需要 compile 才能執行的程式語言。但如果今天你的 Kotlin 檔案是使用 .kts 的副檔名結尾,就可以像其他 scripting language 一樣直接執行囉,而且檔案內也不需要一個 main function,會直接從頭開始執行,好比把整個檔案當作一個 main function,是不是很神奇呢?一個簡單的執行範例:
kotlinc -script [yout_file].kts
雖然說 Gradle 的好處是可以使用 Groovy DSL 寫,寫起來也比 xml 格式更好閱讀。但畢竟 Groovy 對於大部分人來說,也是一門比較不熟悉的語言。我們如果站在 KMM 的角度來看這件事情,Kotlin 跟 Groovy 同為 JVM 家族的一員,如果可以把 Groovy DSL 改用 Kotlin DSL 寫,等於整個專案就可以少掉一種語言所帶來的 context switch,整體的生產力應該可以進一步提升。而 Jetbrains 身為 Kotlin 的維護者,自家的 IDE 應該也要對 Kotlin DSL 有著更好的支援才是。
Groovy 說起來是個蠻神奇的語言,身為 JVM 家族的一員,但他卻有著 dynamic language 的特性,但也因為 dynamic 的特性,讓他無法在 build 之前做更多的檢查,筆者覺得寫起來並不是特別順手。
整個 Gradle Kotlin DSL migration 有以下幾點可以特別注意的:
// build.gradle
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt'
id 'androidx.navigation.safeargs.kotlin'
}
// build.gradle.kts
plugins {
id("com.android.application")
id("kotlin-android")
id("kotlin-kapt")
id("androidx.navigation.safeargs.kotlin")
}
.
繼續串接到其他參數的,但 Kotlin 如果要這樣寫,必須用 {}
把引用的部分明確的指定:// build.gradle
myRootDirectory = "$project.rootDir/tools/proguard-rules-debug.pro"
// build.gradle.kts
myRootDirectory = "${project.rootDir}/tools/proguard-rules-debug.pro"
// build.gradle
buildTypes {
debug {
...
}
release {
...
}
staging {
...
}
}
// build.gradle.kts
buildTypes
getByName("debug") {
...
}
getByName("release") {
...
}
create("staging") {
...
}
其實我覺得 build.gradle.kts 的命名是個相當好的設計,只需要多加一個 .kts 的後綴,從外面看修改幅度相當少,不管你是否使用 kts 你都還是可以使用 build.gradle 這個 keyword 來找到你需要的檔案。
值得一提的是 Groovy 運行的效率低於 Kotlin,但目前 Gradle Kotlin DSL 卻是有可能比 Gradle groovy DSL 慢的。但整體來說還是利大於弊,而且相信未來這方面的差距一定會越來越小!
是不是有點意猶未盡呢?明天讓我們繼續談 build.gradle(.kts) 要怎麼管理 dependency 的版本!