멀티 모듈 구성에서 build.gradle(.kts)? 코드를 작성하다 보면 gradle에 공통으로 사용하는 코드가 생긴다. 예를 들면 hilt 사용을 위해 kapt(혹은 ksp) 플러그인과 의존성을 추가한다거나, Java 버전을 설정하는 코드 등이 있다. 버전을 한 번에 변경하는 건 buildSrc나 버전 카탈로그(toml)를 이용해 처리할 수 있다. 하지만 많은 모듈에 같은 코드를 추가하거나 삭제해야 하는 상황이라면? 프로젝트가 지속되어도 일관성을 유지할 수 있을까? 이런 고민을 해결하기 위해 플러그인을 사용할 수 있다.
현재 프로젝트에서 사용할 정도로만 학습했기 때문에 지식을 전달한다기보다는 어떤 과정으로 공통 코드를 추출했는지 시간 순으로 이야기할 예정이다. (정확히 이 상황에 맞는 공식 문서 페이지를 찾지 못 했다. 그냥 내가 못 찾은 것 같다.)
빌드 로직을 알게된 계기
우선 이 방법을 알게된 건 드로이드 나이츠 2023 컨퍼런스이다. 거의 Track2에서 들었기 때문에 현장에서 해당 내용을 들었다. 바로 최근 프로젝트를 멀티 모듈로 구성했기 때문에 해당 내용이 조금 더 잘 들렸던 거 같다. 물론 적용하는 과정은 쉽지 않았다.
적용하기 위한 발버둥
https://github.com/boostcampwm2023/and04-catchy-tape
GitHub - boostcampwm2023/and04-catchy-tape: 너의 목소리가 들려 ~ 📼
너의 목소리가 들려 ~ 📼. Contribute to boostcampwm2023/and04-catchy-tape development by creating an account on GitHub.
github.com
이 프로젝트에서 빌드 로직을 적용해 사용하고 있다.
1) 발표자료 따라하기
이전에도 발표 내용을 듣고 두 번 정도 시도해 보았으나 실패했다. 실패했던 원인은 발표 내용에 생략된 내용이 있었기 때문이었는데, 그걸 눈치챌 정도로 gradle을 잘 알지 못 했다. 다시 시도하면서 성공할 수 있었던 건 리포지토리가 공개되어 있었기 때문이었다. 실행되는 코드와 실행되지 않는 코드를 라인 바이 라인으로 변경해 가면서 비교하면 실패하는 원인을 찾을 수 있다. 평소 디버깅에도 이 방법을 많이 사용한다.
발표자료에서는 buildSrc라는 이름으로 디렉토리를 만들었는데, sync하면 자동으로 이 디렉토리를 찾는 것 같다. 다만 이 이름을 사용할 경우 기존 build.gradle과 충돌이 일어나고, 이를 해결하기 위해선 점진적 수정이 아니라 한 번에 많은 코드를 수정해야 하는 것 같다.
2) 적용된 오픈소스 커밋 추적하기
적용하기 위해 실제로 가장 많이 참고한 코드는 드로이드 나이츠 2023 앱이다.
https://github.com/droidknights/DroidKnights2023_App/commit/b15ec89d72dd3f0d7cea5e81bc7085c4822f7121
gradle kts 초기 설정 · droidknights/DroidKnights2023_App@b15ec89
1. precompiled-script 2. kotlin-dsl
github.com
이 프로젝트에도 빌드 로직이 적용되어 있어서 관련 PR을 참고하려 했다. 그런데, 이 내용은 사실 PR 없이 커밋된 코드이고 두 번째 커밋에서 찾을 수 있었다. 이 커밋의 변경사항을 추적하여 내 프로젝트에 적용할 수 있었다.
3) 적용하기
https://www.slideshare.net/YoungjikYoon/gradle-kotlin
Gradle Kotlin 컨벤션 플러그인으로 효율적으로 머
Gradle Kotlin 컨벤션 플러그인으로 효율적으로 멀티 모듈 관리하기 - Download as a PDF or view online for free
www.slideshare.net
이미 잘 정리된 발표 자료가 있기 때문에, 여기서는 다르게 적용한 부분이나 자료에 없는 내용만 설명하려고 한다. 발표자료는 33페이지부터 보면 된다.
plugins { | |
`kotlin-dsl` | |
} | |
dependencies { | |
implementation(libs.android.gradlePlugin) | |
implementation(libs.kotlin.gradlePlugin) | |
} | |
gradlePlugin { | |
plugins { | |
register("androidLibrary") { | |
id = "catchytape.android.library" | |
implementationClass = "gradle.plugin.AndroidLibraryPlugin" | |
} | |
// ... | |
} | |
} |
dependencyResolutionManagement { | |
repositories { | |
gradlePluginPortal() | |
google() | |
mavenCentral() | |
} | |
versionCatalogs { | |
create("libs") { | |
from(files("../gradle/libs.versions.toml")) | |
} | |
} | |
} |
빌드 로직을 프로젝트에 포함했으나 서브 모듈로 처리하지는 않는다. 따라서 별도로 settings.gradle.kts를 구성했다. 특히 build.gradle.kts 코드에서 dependencies를 추가하는 부분에 libs를 사용했는데, 이는 버전 카탈로그의 정보를 사용하는 것이라 settings.gradle.kts의 8~12번 라인이 반드시 필요하다.
pluginManagement {
includeBuild("build-logic")
// ...
}
내 프로젝트에서는 디렉토리 이름을 buildSrc가 아닌 build-logic으로 지었는데, 이렇게 할 경우 별도의 코드가 필요하다. 위에서 build-logic은 서브 모듈로 처리하지 않는다고 했다. 따라서 기본적으로는 해당 디렉토리의 설정을 참조하지 않는다. includeBuild를 통해 복합 빌드를 구성할 수 있다.
4) 플러그인 코드
internal class AndroidLibraryPlugin : Plugin<Project> { | |
override fun apply(target: Project) = with(target) { | |
with(pluginManager) { | |
apply("com.android.library") | |
apply("org.jetbrains.kotlin.android") | |
} | |
extensions.configure<LibraryExtension> { | |
compileSdk = 33 | |
defaultConfig.minSdk = 26 | |
compileOptions { | |
sourceCompatibility = JavaVersion.VERSION_17 | |
targetCompatibility = JavaVersion.VERSION_17 | |
} | |
} | |
} | |
} |
생략할 내용이었으나 간단히 코드만 첨부했다. 플러그인은 Plugin<Project>을 구현할 수 있다. 위 코드는 안드로이드 라이브러리 모듈에 공통적으로 들어가는 내용을 넣은 것이다. 테스트를 위한 버전의 코드라 최소한의 내용만 넣고 빌드해 보았다.
현시점 적용 후기
장점
- build.gradle.kts 파일에 들어갈 코드가 간소화 된다.
- 변경 사항을 한 번에 적용할 수 있다.
단점
- 새로운 설정을 추가할 때 플러그인에 이미 정의 되어 있는지 확인해야 한다.
참고자료
https://github.com/droidknights/DroidKnights2023_App/commit/b15ec89d72dd3f0d7cea5e81bc7085c4822f7121
gradle kts 초기 설정 · droidknights/DroidKnights2023_App@b15ec89
1. precompiled-script 2. kotlin-dsl
github.com
https://github.com/laco-dev/gradle-convention-plugins
GitHub - laco-dev/gradle-convention-plugins
Contribute to laco-dev/gradle-convention-plugins development by creating an account on GitHub.
github.com
https://youtu.be/7iag6zpGd98?feature=shared
https://www.slideshare.net/YoungjikYoon/gradle-kotlin
Gradle Kotlin 컨벤션 플러그인으로 효율적으로 머
Gradle Kotlin 컨벤션 플러그인으로 효율적으로 멀티 모듈 관리하기 - Download as a PDF or view online for free
www.slideshare.net
'안드로이드' 카테고리의 다른 글
[Android] Compose를 이용하여 스크롤 가능한 Appbar 만들기 (How to make scrollable appbar) (0) | 2024.03.10 |
---|---|
[Android] 간격이 안 맞아요! (feat. Compose typography) (6) | 2024.02.27 |
[Android] GitHub Actions를 이용하여 자동으로 PR 테스트하기 (1) | 2023.11.15 |
[부스트캠프 웹・모바일 8기] 그룹 프로젝트 시작 (안드로이드) (2) | 2023.11.08 |
[Android] 네트워크 요청을 처리하는 여러 가지 방법 (Retrofit2, 비동기 처리) (4) | 2023.10.15 |