안녕하세요 점냥입니다 :)
새 안드로이드 프로젝트를 만들고 settings.gradle 파일에 열어보면 RepositoriesMode를 설정하는 코드를 확인할 수 있는데요. 이 것이 어떤 기능이고 왜 필요한지 간단히 정리해보려고 합니다.
Repository
repositories {
mavenCentral()
}
안드로이드 개발을 하면서 우리는 자연스럽게 외부 라이브러리를 사용하고 있습니다. 네트워크 통신 라이브러리 Retrofit, Json 파싱을 위한 Gson, 심지어 Android Jetpack 라이브러리까지요. 그런데 Gradle 스크립트에서 외부 라이브러리의 패키지와 버전만 명시해주고 있을 뿐 url은 보이지 않습니다. 어떻게 다운로드할 수 있었을까요?
Gradle Repository는 오픈되어 있는 외부 종속성 라이브러리 다운로드하여 사용할 수 있는 저장소를 선언합니다. 현재는 deprecated 된 jcenter를 포함해서 mavenCentral, google 등의 인기 있는 유명한 오픈 소스 라이브러리들이 대거 오픈되어 있어 특별하지 않다면 mavenCentral, google 저장소만 선언하더라도 웬만한 라이브러리들은 다운로드하여 사용할 수 있습니다.
RepositoriesMode로 Setting.gradle에서 Repository 통합 관리
Project 종속성
├── build.gradle (root project)
├── sub project(app)
│ └── build.gradle
├── sub project(another)
│ └── build.gradle
│ ...
└── settings.gradle
Android 프로젝트를 처음 생성하면 기본적으로 app module을 가지고 있습니다. Gradle 프로젝트 관점으로 보면 위 구조가 됩니다. 각각 project는 build.gradle 내에 개별적으로 의존성을 관리를 위해 Repositories를 선언할 수 있습니다.
- A sub project
repositories {
google()
}
- B sub project
repositories {
google()
}
그런데 Repositories를 project 각각 관리할 경우 위처럼 중복되게 Repositories를 선언하게 될 수 있으며, 프로젝트에 같이 협업하는 안드로이드 개발자가 수가 많고 멀티 모듈로 개발되는 프로젝트의 경우 관리가 점점 힘들어질 수 있습니다.
allprojects {
repositories {
google()
}
}
임시방편으로 Gradle Root project에서 allprojects 스크립트를 통해 모든 Project에 동일한 Repositories를 선언해주는 방법을 사용할 수 있습니다. 하지만 sub project에 추가로 선언되는 repositories를 빌드나 컴파일 타임에서 발견할 수 없어 장기적으로 보면 관리하기 어려울 수 있습니다.
RepositoriesMode
dependencyResolutionManagement { //종속성 문제들을 해결 관리
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
RepositoriesMode를 사용하면 위 문제점을 해결할 수 있습니다. RepositoriesMode는 Android 프로젝트 Gradle Repository 선언과 적용되는 범위를 3가지 모드로 지정할 수 있습니다.
PREFER_PROJECT | 기본 값, setting.gradle 선언된 repositories를 무시하며 proejct 내에 선언된 repositories를 참조합니다. |
FAIL_ON_PROJECT_REPOS | proejct 내에 repositories를 선언되어 있을 경우 빌드 타임에 오류를 발생합니다. |
PREFER_SETTINGS | proejct 내에 선언된 repositories를 무시하며 setting.gradle에 선언된 repositories를 참조합니다. |
3가지 모드 중, FAIL_ON_PROJECT_REPOS 모드는 Gradle Root project 내에 repositories를 선언한 뒤 컴파일하게 되면 아래처럼 빌드 오류가 발생합니다.
Caused by: org.gradle.api.InvalidUserCodeException:
Build was configured to prefer settings repositories over project repositories but repository 'Google' was added by build file 'build.gradle'
IDE 차원에서 repositories의 선언 부분을 settings.gradle 모이는 것을 보장해주므로 아주 유용한 기능인 듯합니다!
'Android > Gradle' 카테고리의 다른 글
[Android] Gradle 버전 카탈로그를 사용해 버전 관리하기 (0) | 2023.06.01 |
---|---|
[Android] 빌드 속도 개선 with Gradle Options (0) | 2022.11.09 |
[Android] Spotless 설정으로 팀과 코드 컨벤션 맞추기 (3) | 2022.10.03 |