Gradle是一款基於JVM的新一代構建工具,使用一種基於Groovy的特定領域語言(DSL)來宣告專案設定。目前,Gradle 官方也提供了基於 Kotlin 的構建指令碼語言:Gradle Kotlin DSL , 提供了類 groovy 的程式碼風格。Gradle官網上也有從Groovy遷移到Kotlin的指南:Migrating build logic from Groovy to Kotlin
Groovy or Kotlin
雖然都是基於Jvm的語言,但兩者還是有著比較大的差異,但各自都有自己的優勢
語法差異
groovy是動態型別指令碼語言,可以直接當做指令碼跑。語言也比較靈活。Kotlin語言比Groovy語言更加嚴格,並且具有內建的空安全性。
IDE支援
Android Studio都對兩者有很好地支援。不過畢竟Kotlin是親兒子,不排除會對其推出些特殊的支援。還有一點差別Kotlin DSL指令碼改動後,studio會自動同步改動,而不是像原來一樣會出現一個按鈕來手動觸發。這點上我更喜歡原來的方式。
指令碼檔案的命名
- Groovy DSL指令碼副檔名為
*.gradle
。 - Kotlin DSL指令碼副檔名為
*.gradle.kts
。
所以要使用Kotlin DSL編寫Gradle編譯指令碼,只需要將 build.gradle
改為 build.gradle.kts
即可,同理settings.gradle
檔案也可以被重新命名為settings.gradle.kts
。
另外Groovy DSL指令碼檔案和Kotlin DSL指令碼檔案可以共存,可以不用全部替換。
構建速度
官網上介紹說採用Kotlin DSL,全量構建的時候會慢一些,不過實際編譯時差距不明顯,在可接受範圍內。
語法介紹
Groovy字串可以用單引號引用 '字串'
或雙引號 “字串”
,而Kotlin只能使用雙引號 “字串”
。
Groovy中函式呼叫的時候,如果只有一個引數,還可以不加括號;
轉換前:
implementation 'androidx.appcompat:appcompat:1.1.0-alpha01'
複製程式碼
轉換後:
implementation("androidx.appcompat:appcompat:1.1.0-alpha01")
複製程式碼
轉換前:
applicationId "org.renny.test"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
複製程式碼
轉換後:
applicationId = "org.renny.test"
minSdkVersion(15)
targetSdkVersion(28)
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner"
複製程式碼
apply(plugin = "com.android.application")
apply(plugin = "kotlin-android")
apply(plugin = "kotlin-android-extensions")
複製程式碼
plugins {
id("com.android.application")
kotlin("android")
kotlin("android.extensions")
}
複製程式碼
使用外掛
//groovy
buildscript {
repositories {
gradlePluginPortal()
}
dependencies {
classpath('org.springframework.boot:spring-boot-gradle-plugin:2.0.2.RELEASE')
}
}
apply plugin: 'java'
apply plugin: 'jacoco'
apply plugin: 'org.springframework.boot'
複製程式碼
//kotlin
buildscript {
repositories {
gradlePluginPortal()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.2.RELEASE")
}
}
apply(plugin = "java")
apply(plugin = "jacoco")
apply(plugin = "org.springframework.boot")
複製程式碼
不過官方強烈推薦採用 plugins {}
的方式引入外掛
plugins {
id 'com.android.application'
}
複製程式碼
plugins {
id("com.android.application")
kotlin("android")
kotlin("android.extensions")
}
複製程式碼
上面的kotlin()是kotlin DSL定義的擴充套件屬性:
fun PluginDependenciesSpec.kotlin(module: String): PluginDependencySpec =
id("org.jetbrains.kotlin.$module")
複製程式碼
建立Gradle Task
task greeting {
doLast { println 'Hello, World!' }
}
複製程式碼
task("greeting") {
doLast { println("Hello, World!") }
}
複製程式碼
小結
本文介紹並比較了Gradle’的Groovy DSL 和Kotlin DSL的一些語法差異,並且為遷移到Kotlin DSL提供了一些基礎介紹。總體來說,兩者並沒有太大的優劣差異,如果你對Kotlin情有獨鍾或者感興趣,可以嘗試使用下Kotlin DSL