Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발새발 블로그

Gradle Kotlin DSL을 무작정 적용해보자! - 개발새발 블로그 본문

kotlin

Gradle Kotlin DSL을 무작정 적용해보자! - 개발새발 블로그

SeanBlog 2020. 1. 14. 17:53

안녕하세요! 개발새발로 코딩하는 블로그입니다.

오늘 알아볼주제는 Gradle kotlin dsl 입니다!

먼저 설명에 앞서 필요한 몇가지 개념에 대해 잡고 넘아가야합니다..

 

 

먼저 저희가 개발을 진행할때 자주 사용되는 프로그램(Integrated Development Environment, IDE)은 크게 3가지 기능으로 나눌 수 있습니다.

 

¤ 소스 코드 편집기 : 시각적으로 사용자가 보기 편하도록 구문 강조와 같은 기능을 포함, 코드 작성을 돕는 텍스트 편집기입니다. 또한 언어별 자동 완성 기능과 코드 작성 중 버그 검사를 제공합니다.

 

¤ 로컬 빌드 자동화 : 컴퓨터 소스 코드를 바이너리 코드로 컴파일링하고, 바이너리 코드를 패키징하고 자동화 테스트를 실행하는 등 간편하고 반복가능한 태스크를 개발자가 사용하는 소프트웨어의 로컬 빌드를 생성할 때 자동화해주는 유틸리티입니다.

 

¤ 디버거: 원본 코드에 있는 버그 위치를 그래픽으로 표시할 수 있는 다른 프로그램을 테스트하는 프로그램입니다.

 

이 중 로컬 빌드 자동화에 해당하는 빌드도구(소스코드를 실행가능한 애플리케이션 생성물로 자동으로 만드는 프로그램. 빌드과정은 소스코드를 컴파일하고 연결하고 패키징하여 실행가능한 형태로 가공합니다.) 중 널리 사용되고 있는 빌드도구는 Gradle, Maven, Ant 등 이있습니다.

 

이 중 Gradle은 유연함과 성능에 초점을 둔 오픈소스 빌드도구이며, 기본적으로 Gradle Groovy DSL 이 사용됩니다.

 

 

 

 Gradle Groovy DSL 과 비교한 Gradle Kotlin DSL 의 장점 

 

¤ 코드의 자동완성

 

¤ 빠른 문서보기가 가능

 

¤ 리팩토링 기능

 

¤ 오류코드 강조 표시

               

 < Gradle Groovy DSL >
 < Gradle Kotlin DSL >

 

p.s. 코틀린 DSL모든 문자열을 큰따옴표(")로 작성해야합니다.(통일성)

     문자열에서 위치변환자 사용이 자유롭다.

 


 실제 적용해보기! 

 

Gradle Groovy DSL 의 기본 확장자 : .gradle / .build.gradle / settings.gradle 

Gradle Kotlin DSL 의 기본 확장자 : .gradle.kts / .buuld.gradle.kts / settings.gradle.kts

 

 

 

 

1 단계 )

먼저 New -> Directory를 통해 buildSrc라는 이름의 디렉토리를 생성해줍니다.

 

생성된 buildSrc 안에 build.gradle.kts 를 생성해줍니다.

생성된 buildSrc 안에 src/main/java 디렉토리를 생성하고 그 하위에 Dependencies.kt를 생성합니다.

 

총 2개의 파일이 추가되어야하며 최종적인 화면은 다음과 같습니다.

 

<build.gradle.kts>
plugins {
    `kotlin-dsl`
}
repositories {
    jcenter()
}

              

< Dependencies.kt >
object Apps {
    const val compileSdk = 29
    const val minSdk = 21
    const val targetSdk = 29
    const val versionCode = 1
    const val versionName = "1.0.0"
}
 
object Versions {
    const val gradle = "3.5.2"
    const val kotlin = "1.3.50"
    const val appcompat = "1.0.2"
 
    const val junit = "4.12"
}
 
object Libs {
    const val appcompat = "androidx.appcompat:appcompat:${Versions.appcompat}"
}
 
object TestLibs {
    const val junit = "junit:junit:${Versions.junit}"
}
 

 

두 파일 모두 내용을 작성하신 후  Sync now를 눌러주세요.

 

 

 

 

 

2단계 )

settings.gradle  -> settings.gradle.kts  이름 변경

 

                   

< settings.gradle > 
include ':app'
rootProject.name='kotlinDSL'
 
                  ↓
 
 < settings.gradle.kts > 

include (":app")

rootProject.name="kotlinDSL"

 
 
 

3단계 ) 프로젝트수준 build.gradle 변경

 

build.gradle -> build.gradle.kts  이름 변경

3-1 단계 ) dependencies 변경

 < build.gradle > 
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.2'
    }

                                               ↓

 < build.gradle.kts > 

dependencies {

classpath("com.android.tools.build:gradle:${Versions.gradle}")

    classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.kotlin}")

}

 

3-2 단계 ) task clean 변경

 

< build.gradle >
task clean(type: Delete) {
    delete rootProject.buildDir
}
 

                                                 ↓

< build.gradle.kts >

tasks.register("clean",Delete::class){

    delete(rootProject.buildDir)

}

 

3-3 단계 ) repositories 변경

< build.gradle >
   repositories {
        google()
        jcenter()
    }
 
                          ↓
 
< build.gradle.kts >

repositories {

        google()

        jcenter()

        maven { url = uri("https://jitpack.io") }

   }

※ ext.kotlin_version = 'x.x.xx' 는 삭제해주세요 

 

 

4단계 ) 수준 build.gradle 변경

 

build.gradle -> build.gradle.kts  이름 변경

4-1 단계 ) plugin 부분 변경

< build.gradle >
apply plugin: 'com.android.application'
 
apply plugin: 'kotlin-android'
 
apply plugin: 'kotlin-android-extensions'

                         ↓

< build.gradle.kts >
plugins {
    id("com.android.application")
    kotlin("android")
    kotlin("android.extensions")
    kotlin("kapt")
}
 

 

4-2 단계 ) android 부분 변경

 

 

< build.gradle >
android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "com.sean.kotlindsl"
        minSdkVersion 19
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

                                                           ↓

< build.gradle.kts >
android {
    compileSdkVersion(Apps.compileSdk)
    defaultConfig {
        minSdkVersion(Apps.minSdk)
        targetSdkVersion(Apps.targetSdk)
        versionCode = Apps.versionCode
        versionName = Apps.versionName
        multiDexEnabled = true
        setProperty("archivesBaseName", "$applicationId-v$versionName($versionCode)")
        resConfigs("en")
        ndk {
            abiFilters("armeabi-v7a", "x86", "arm64-v8a", "x86_64")
        }
        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }
 
    buildTypes {
        getByName("debug") {
            isMinifyEnabled = false
            isDebuggable = true
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
        getByName("release") {
            isMinifyEnabled = false
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
 
    dataBinding {
 
        isEnabled = true
 
    }
}

 

4-3 단계 ) dependencies 부분 변경

 
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.core:core-ktx:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
 

                                                           ↓

 
dependencies {
    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
    implementation(Libs.kotlin)
    implementation(Libs.appcompat)
    implementation(Libs.Permission.permission)
 
 
/* ------------------------------------------------------------------------------------------------ */
사용자에 따라 추가적인 implementaion 추가 , Dependencies.kt에 작성 후 적용
 
    implementation(Libs.Glide.glide)
    implementation(Libs.Glide.okhttp3Intergration)
 
    implementation(Libs.Retrofit.retrofit)
    implementation(Libs.Retrofit.converterGson)
    implementation(Libs.Retrofit.mock)
    implementation(Libs.Retrofit.rxjava2)
 
    implementation(Libs.OkHttp.loggingInterceptor)
 
    implementation(Libs.Firebase.core)
   implementation(Libs.Firebase.messaging)
 
/* ------------------------------------------------------------------------------------------------ */
 
    implementation(Libs.Jakewharton.Timber.common)
    testImplementation(TestLibs.junit)
    implementation ("androidx.core:core-ktx:1.1.0")
    implementation("androidx.constraintlayout:constraintlayout:1.1.3")
    implementation ("com.android.support:design:28.0.0")
    androidTestImplementation ("androidx.test.ext:junit:1.1.1")
    androidTestImplementation ("androidx.test.espresso:espresso-core:3.2.0")
}
 

 

위에서 작성했던 Dependencies.kt에 값을 사용하여 코드를 깔끔하게 작성할 수 있습니다. 

Comments