Multi module에서 의존성 관리
출처 : https://handstandsam.com/2018/02/11/kotlin-buildsrc-for-better-gradle-dependency-management/
1.수동 관리
의존성을 직접 관리한다.
module_a/build.gradle
implementation "com.android.support:support-annotations:27.0.2"
implementation "com.android.support:appcompat-v7:27.0.2"
implementation "com.squareup.retrofit2:retrofit:2.3.0"
implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0"
implementation "io.reactivex.rxjava2:rxjava:2.1.9"
module_b/build.gradle
implementation "com.android.support:support-annotations:27.0.2"
implementation "com.android.support:appcompat-v7:27.0.2"
implementation "com.squareup.retrofit2:retrofit:2.3.0"
implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0"
implementation "io.reactivex.rxjava2:rxjava:2.1.9"
2.ext 블록
구글이 권장하는 방법.
Root-level build.gradle
ext {
versions = [
support_lib: "27.0.2",
retrofit: "2.3.0",
rxjava: "2.1.9"
]
libs = [
support_annotations: "com.android.support:support-annotations:${versions.support_lib}",
support_appcompat_v7: "com.android.support:appcompat-v7:${versions.support_lib}",
retrofit :"com.squareup.retrofit2:retrofit:${versions.retrofit}",
retrofit_rxjava_adapter: "com.squareup.retrofit2:adapter-rxjava2:${versions.retrofit}",
rxjava: "io.reactivex.rxjava2:rxjava:${versions.rxjava}"
]
}
module_a/build.gradle
implementation libs.support_annotations
implementation libs.support_appcompat_v7
implementation libs.retrofit
implementation libs.retrofit_rxjava_adapter
implementation libs.rxjava
module_b/build.gradle
implementation libs.support_annotations
implementation libs.support_appcompat_v7
implementation libs.retrofit
implementation libs.retrofit_rxjava_adapter
implementation libs.rxjava
수동 관리보다는 비약적 발전이지만, IDE에서 아직 지원되지 않는다. (Autocomplete되지 않음)
3.Kotlin + buildSrc
의존성 관리와 IDE 자동완성 지원을 위해 kotlin 코드를 가지는 buildSrc 모듈을 만들 수 있다.
Gradle 문서를 보면
Gradle이 수행되면
buildSrc
디렉토리가 존재하는지 체크한다. 이 경우 Gradle은 자동적으로 코드를 컴파일하고 테스트한 뒤 당신의 빌드 스크립트의 classpath에 넣는다. 어떤 추가적인 지시도 규정 할 필요가 없다.
buildSrc 모듈에는 단 2개의 파일만 필요하다:
- build.gradle.kts
- 코틀린 코드 (이 경우 Dependencies.kt)
buildSrc/build.gradle.kts
plugins {
`kotlin-dsl`
}
buildSrc/src/main/java/Dependencies.kt
object Versions {
val support_lib = "27.0.2"
val retrofit = "2.3.0"
val rxjava = "2.1.9"
}
object Libs {
val support_annotations = "com.android.support:support-annotations:${Versions.support_lib}"
val support_appcompat_v7 = "com.android.support:appcompat-v7:${Versions.support_lib}"
val retrofit = "com.squareup.retrofit2:retrofit:${Versions.retrofit}"
val retrofit_rxjava_adapter = "com.squareup.retrofit2:adapter-rxjava2:${Versions.retrofit}"
val rxjava = "io.reactivex.rxjava2:rxjava:${Versions.rxjava}"
}
위의 수정을 적용한 뒤, Gradle 싱크가 완료되면 Android studio에서 모든 value에 접근할 수 있다.
결과는 "ext"의 매우 비슷하게 보이지만 자동 완성과 클릭 지원(정의한 위치로 이동)이 된다.
module_a/build.gradle
implementation Libs.support_annotations
implementation Libs.support_appcompat_v7
implementation Libs.retrofit
implementation Libs.retrofit_rxjava_adapter
implementation Libs.rxjava
module_b/build.gradle
implementation Libs.support_annotations
implementation Libs.support_appcompat_v7
implementation Libs.retrofit
implementation Libs.retrofit_rxjava_adapter
implementation Libs.rxjava