Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Migrate Gradle To Kotlin DSL

Luka
November 30, 2021

Migrate Gradle To Kotlin DSL

A presentation about the topic "Migrate Gradle To Kotlin DSL", GDG Tbilisi Android Meetup November 30

Luka

November 30, 2021
Tweet

Other Decks in Technology

Transcript

  1. TABLE OF CONTENTS ❖ What is DSL (with examples) ❖

    buildSrc Directory ❖ Migrate Project-Module Gradle Files to Kotlin DSL ❖ Control Dependencies Versions ❖ Comparison: Groovy DSL VS Kotlin DSL
  2. What is DSL ? A domain-specific language is a computer

    language specialized to a particular application domain Generally, DSLs are developed in close coordination with the experts in the field for which the DSL is being designed.
  3. Kotlin DSL Gradle’s Kotlin DSL provides an alternative syntax to

    the traditional Groovy DSL with an enhanced editing experience in supported IDEs, with superior content assist, refactoring, documentation, and more.
  4. Create our first Kotlin DSL file Create buildSrc directory at

    the project root and Inside buildSrc create the file build.gradle.kts and enable the kotlin-dsl plugin. import org.gradle.kotlin.dsl.`kotlin-dsl` plugins { `kotlin-dsl` } repositories { google() mavenCentral() }
  5. Extract All Gradle Stuff To buildSrc Extract all dependencies, plugins,

    configs, verions etc. into separated objects. object Versions { const val GRADLE: String = "7.0.3" const val KOTLIN: String = "1.5.31" const val KTX_CORE: String = “1.7.0“ const val RETROFIT2: String = “2.6.2" const val HILT: String = "2.39.1" . . . . . } object Dependencies { const val KTX_CORE: String = "androidx.core:core-ktx:${Versions.KTX_CORE}" const val RETROFIT: String = "com.squareup.retrofit2:retrofit:${Versions.RETROFIT2}" const val HILT: String = "com.google.dagger:hilt-android:${Versions.HILT}“ . . . . . }
  6. Extract All Gradle Stuff To buildSrc object Plugins { const

    val ANDROID_APPLICATION = "com.android.application“ const val KOTLIN_ANDROID = "android“ const val KOTLIN_KAPT = "kapt" const val DAGGER_HILT = "dagger.hilt.android.plugin" const val DETEKT = "io.gitlab.arturbosch.detekt" } object DefaultConfig { const val MIN_SDK = 23 const val TARGET_SDK = 31 const val COMPILE_SDK = 31 }
  7. Migrate Classpathes buildscript { repositories { google() mavenCentral() } dependencies

    { classpath(Build.BUILD_GRADLE) classpath(Build.KOTLIN_GRADLE_PLUGIN) classpath(Build.DETEKT) classpath(Build.HILT_GRADLE_PLUGIN) } } Kotlin DSL buildscript { repositories { google() mavenCentral() } dependencies { classpath Build.BUILD_GRADLE classpath Build.KOTLIN_GRADLE_PLUGIN classpath Build.DETEKT classpath Build.HILT_GRADLE_PLUGIN } } Groovy DSL project gradle project gradle
  8. Project Plugin Expanding Properties Issue Excpected Behaviour Build file 'C:\...\KotlinDSLMeetup\build.gradle'

    line: 23 Could not compile build file 'C:\...\KotlinDSLMeetup\build.gradle'. > startup failed: build file 'C:\...\KotlinDSLMeetup\build.gradle': 23: argument list must be exactly 1 literal String or String with property replacement Groovy DSL project gradle Reality Gradle Issue: https://github.com/gradle/gradle/issues/1697 plugins { id "io.gitlab.arturbosch.detekt" version Versions.DETEKT or id Plugins.DETEKT version Versions.DETEKT }
  9. Project Plugin Expanding Properties Issue Solutions Groovy DSL project gradle

    buildcript { ext { detekt_version = Versions.DETEKT } } plugins { id "io.gitlab.arturbosch.detekt" version "$detekt_version" } 1. Extract version to gradle.properties ---> detektVersion=1.18.1 2. Extract version to ext (project gradle) Kotlin DSL project gradle plugins { id(Plugins.DETEKT) version Versions.DETEKT }
  10. Tasks Declaration Groovy DSL project gradle Kotlin DSL project gradle

    detekt { tasks.register<io.gitlab.arturbosch.detekt.Detekt>("detektAll") {...} tasks.register<io.gitlab.arturbosch.detekt.DetektCreateBaselineTask> ("detektGenerateProjectBaseline") {...} } detekt { tasks { task detektAll(type: Detekt) {...} task detektGenerateProjectBaseline(type: DetektCreateBaselineTask) {...} } }
  11. Migrate Module Gradle Groovy DSL module gradle Kotlin DSL module

    gradle plugins { id 'com.android.application' id 'kotlin-android' id 'kotlin-kapt' id 'io.gitlab.arturbosch.detekt' id 'dagger.hilt.android.plugin' } plugins { id("com.android.application") kotlin("android") kotlin("kapt") id("io.gitlab.arturbosch.detekt") id(“dagger.hilt.android.plugin") }
  12. Migrate Module Gradle Groovy DSL module gradle Kotlin DSL module

    gradle plugins { id 'com.android.application‘ id 'kotlin-android‘ id 'kotlin-kapt‘ id 'io.gitlab.arturbosch.detekt‘ id 'dagger.hilt.android.plugin' } plugins { id("com.android.application") kotlin("android") // same as "kotlin-android" kotlin("kapt") // same as "kotlin-kapt" id("io.gitlab.arturbosch.detekt") id(“dagger.hilt.android.plugin") }
  13. Migrate Build Types Groovy DSL module gradle Kotlin DSL module

    gradle buildTypes { getByName("debug") { . . . } create("meetup") { . . . } getByName("release") { . . . } } buildTypes { debug { . . . } meetup { . . . } release { . . . } }
  14. Migrate Product Flavors Groovy DSL module gradle Kotlin DSL module

    gradle productFlavors { create("free") { . . . } create("pro") { . . . } } productFlavors { free { . . . } pro { . . . } }
  15. Migrate Module Dependencies Groovy DSL module gradle Kotlin DSL module

    gradle dependencies { // Dependencies implementation(Dependencies.KTX_CORE) // Annotation processing kapt(AnnotationProcessing.HILT_COMPILER) // Testing testImplementation(TestDependencies.JUNIT4) androidTestImplementation(AndroidTestDependencies.EXT_JUNIT) } dependencies { // Dependencies implementation Dependencies.KTX_CORE // Annotation processing kapt AnnotationProcessing.HILT_COMPILER // Testing testImplementation TestDependencies.JUNIT4 androidTestImplementation AndroidTestDependencies.EXT_JUNIT }
  16. Comparison: Groovy DSL VS Kotlin DSL Feature Groovy DSL Kotlin

    DSL Readability ✔ Performance ✔ Better IDE Experience ✔ Compile Time Errors ✔ Less Ambiguity ✔ Scalability ✔