gradle kotlin dsl migration - 2. Gradle 에서 kts 로 migration

2022. 5. 24. 21:46android


1편에 이어 두 번째 시간입니다.

여기서는 기존의 Gradle 파일을 바꾸는 작업을 하겠습니다.

groovy에서 kotlin으로 변경할 때는 몇 가지 규칙이 있습니다.

 

https://developer.android.com/studio/build/migrate-to-kts?hl=ko 

 

Groovy에서 KTS로 빌드 구성 이전  |  Android 개발자  |  Android Developers

Gradle 구성 파일을 Groovy에서 KTS로 이전합니다.

developer.android.com

 

규칙의 내용은 공식 홈페이지에서 확인이 가능합니다. 

But 저것만 보면 조금 이해하기 어렵더라구요.

저랑 같이 한번 실습을 통해 무엇을 어떻게 바꾸는지 한번 확인해보도록 하겠습니다!!

 


여기서 먼저 settings.gradle을 바꿔주겠습니다. ( 빠르게 Shift + F6 가능)

 

rename으로 들어가서

 

파일명 뒤에 .kts 를 쓰고 Refactor 를 누릅니다. 


현재 settings.gradle.kts 은 이런 상태입니다

pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}
rootProject.name = "My App"
include ':app' -> include(":app")

 

맨 밑에 include만 

include(":app")

이렇게 변경합니다. 그리고 sync now 합니다.


이제 Project 단위의 build.gradle 파일명도 Refactor를 이용하여 

뒤에 .kts 를 써주고 변경하여 줍니다.

여기서 규칙 1을 적용합니다.

규칙 1. ' ' 를 사용하는 애들은 전부 " " 큰따옴표로 바꿔주고 괄호 필수!!!!!!

 

 

아래에 내용을 변경해줍니다.

' ' -> (" ")

task도 변경해주세요!

 

build.gradle.kts(Project: MyApp)

plugins {
    id 'com.android.application' version '7.2.0' apply false
    id 'com.android.library' version '7.2.0' apply false
    id 'org.jetbrains.kotlin.android' version '1.6.21' apply false
    id 'org.jetbrains.kotlin.jvm' version '1.6.21' apply false
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

 

 

안에 있는 plugins 는 각자 앞 글에 1번 방식 혹은 2번 방식에 따라 다르게 될 수 있습니다. 

무조건 복붙하시면 어딘가에서 분명 오류가 발생할 수 있으니까 맞춰서 해주셔야 합니다.

plugins {
    id ("com.android.application") version "7.2.0" apply false
    id ("com.android.library") version "7.2.0" apply false
    id ("org.jetbrains.kotlin.android") version "1.6.10" apply false
    id ("org.jetbrains.kotlin.jvm") version "1.6.21" apply false
}

tasks.register("clean",Delete::class){
    delete(rootProject.buildDir)
}

 

위에 id 'org.jetbrains.kotlin.jvm' version '1.6.21' apply false 는 module 추가를 통한 방식으로 

buildSrc 폴더를 만들면 생성되는 플러그인 id 입니다. 

만약 모듈로 생성한게 아닌 프로젝트 폴더에 우클릭 -> Directory 추가를 해서 직접 만들면 없는 플러그인입니다.

그러니 무조건 복붙하시면 안되고 버전 확인하시고 필요한 plugins 만 사용해주세요!! 안그러면 늪에 빠집니다ㅠㅠ

 

또한 compose로 만들면 좀 달라지는데 

compose를 사용하실때는 compose 버전과 

플러그인의  id 'org.jetbrains.kotlin.android' version '1.5.31' apply false

version을 잘 맞춰주셔야 합니다.

1.6.xx 이상을 하시면 자동으로 kotlin migration event 알림이 오른쪽 아래에 뜨는데

이때 몇 가지 사항들을 migration 하면 compose 와 충돌이 납니다.

아직 정확한 해결방안을 찾지 못해서 다음에 찾게 되면 글로 작성해보는 시간을 가져보겠습니다.

(=> 당시 업데이트가 아직 되지 않아 오류가 났던거라 지금은 신경쓰지 않으셔도 됩니다.)

 


이제 마지막 Module 단위의 build.gradle도 변경할 시간입니다.

 

 

Shift + F6 을 눌러 변경!! 그리고 sync now!

 

sync now 하시면 역시나 이렇게 오류가 막 생깁니다. 

 

차근차근 변경해줍니다.

 

먼저 맨 위에 

 


plugins

변경 전 )

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
}

 

변경 후)

plugins {
    id ("com.android.application")
    id ("org.jetbrains.kotlin.android")
}

android

변경 전 )

android {
    compileSdk 32

    defaultConfig {
        applicationId "com.devyoung.myapp"
        minSdk 26
        targetSdk 32
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

변경 후 )

android {
    compileSdk = 32

    defaultConfig {
        applicationId = "com.devyoung.myapp"
        minSdk = 26
        targetSdk = 32
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

 


dependencies

 

변경 전 )_ empty activity로 해서 dependency가 많이 없습니다. 그 점 참고해주세요!

dependencies {
    implementation 'androidx.core:core-ktx:1.7.0'
    implementation 'androidx.appcompat:appcompat:1.4.1'
    implementation 'com.google.android.material:material:1.6.0'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
dependencies {
    implementation ("androidx.core:core-ktx:1.7.0")
    implementation ("androidx.appcompat:appcompat:1.4.1")
    implementation ("com.google.android.material:material:1.6.0")
    testImplementation ("junit:junit:4.13.2")
    androidTestImplementation ("androidx.test.ext:junit:1.1.3")
    androidTestImplementation ("androidx.test.espresso:espresso-core:3.4.0")
}

그리고 역시 sync now 하면 성공적으로 finish 하는 걸 보실 수 있습니다.

 

하지만 여기서 끝이 아닙니다!!!

 

이제 buildSrc를 열고 아까 main을 들어가 java or kotlin 파일에 몇 개의 파일을 만들어 

좀 더 효율적으로 여러 gradle을 관리하는 방법을 알아보겠습니다. 

 


제가 공부하던 noteapp을 예제로 가져왔습니다.

아래 사진을 보시면 data , domain module 이 있습니다. 또 gradle 파일이 app, data , domain 등 다양하게 있습니다. 

 

이럴 때 한 번에 관리하기 쉽게 아래처럼 AppConfig 와 Dependencies 를 구별하여 만들어줍니다. ( 무조건 이렇게 한다거나 , 모두가 그런 것은 아닙니다!!! )

 

AppConfig에 compile sdk나 최소 midsdk 등을 적어주고 관리합니다.

 

 

Dependencies.kt 안에 또 이런식으로 적어서 dependecy를 관리할 수 있습니다.

 

이제 위에 Dependencies와 AppConfig를 가지고 아래와 같이 변경하여 줍니다.

 

android 

변경 전 ) app build.gradle.kts에 android 영역 코드를 변경합니다.

android {
    compileSdk 32

    defaultConfig {
        applicationId "com.devyoung.myapp"
        minSdk 26
        targetSdk 32
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

 

 

이런식으로 작성을 할 수 있습니다.

android {
    compileSdk = AppConfig.complieSdk

    defaultConfig {
        applicationId = "com.devyoung.noteapp2"
        minSdk = AppConfig.minSdk
        targetSdk = AppConfig.targetSdk
        versionCode = AppConfig.versionCode
        versionName = AppConfig.versionName

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables {
            useSupportLibrary = true
        }
    }
    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                    getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
            )
        }
    }
    buildFeatures {
        compose = true
    }
    composeOptions {
        kotlinCompilerExtensionVersion = "1.2.0-beta01"
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
    packagingOptions {
        resources {
            excludes += "/META-INF/{AL2.0,LGPL2.1}"
        }
    }

}

 

 

dependencies 도 이렇게 변경했던걸 다시 

 

아래처럼 변경할 수 있습니다.

이런식으로 작성할 수 있습니다.

 

이상 kotlin migration을 알아봤습니다.

 

아직 글솜씨가 부족하고 저도 완벽하진 않아 많은 도움이 될 수 있을지 모르겠지만 꼭 도움이 되었으면 좋겠습니다.

 

읽어주셔서 감사합니다!!