Gradle Kotlin DSL遷移指南

大頭呆發表於2019-01-18

Gradle是一款基於JVM的新一代構建工具,使用一種基於Groovy的特定領域語言(DSL)來宣告專案設定。目前,Gradle 官方也提供了基於 Kotlin 的構建指令碼語言:Gradle Kotlin DSL , 提供了類 groovy 的程式碼風格。Gradle官網上也有從Groovy遷移到Kotlin的指南:Migrating build logic from Groovy to Kotlin

img

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

相關文章