settings.gradle.kts
파일은 Gradle 프로젝트의 구조와 설정을 담당하는 핵심적인 파일입니다. Kotlin 기반의 Gradle 설정인 Kotlin DSL에서는 이 파일이 매우 중요하죠. 각각의 주요 키워드에 대한 설명과 가상 시나리오를 통한 예시 코드를 함께 살펴보겠습니다.
🌟 주요 키워드 설명
- providers: Gradle에서 제공하는 기능 중 하나로, 설정 값이나 환경 변수, 시스템 속성 등을 안전하게 읽어 올 수 있게 해줍니다.
- rootProject: 최상위 프로젝트를 나타내는 객체입니다. 이를 통해 최상위 프로젝트의 이름, 설명 등의 속성을 설정할 수 있습니다.
- include: 하위 프로젝트들을 최상위 프로젝트에 포함시키는 함수입니다.
- pluginManagement: 프로젝트에 사용되는 플러그인의 버전, 저장소 등을 관리하는 블록입니다.
- resolutionStrategy: 플러그인이나 의존성의 버전 해상도 전략을 정의하는 블록입니다.
- eachPlugin: 각 플러그인에 대한 설정을 정의하는 블록입니다.
- requested:
eachPlugin
내에서 현재 요청된 플러그인의 정보에 접근하는 객체입니다.
🌍 가상 시나리오: 회사 내부 라이브러리 관리 시스템 구축
다음은 settings.gradle.kts
를 활용하여 회사 내부에서 사용하는 여러 라이브러리 프로젝트를 관리하려는 가상 시나리오를 가정한 예시 코드입니다.
// providers를 통해 gradle.properties 값들을 안전하게 가져오는 함수
fun gradleProperty(key: String): String = providers.gradleProperty(key).get()
// 최상위 프로젝트의 이름을 설정합니다.
rootProject.name = gradleProperty("rootProject.name")
// 'utils', 'networking', 'ui' 세 개의 라이브러리 프로젝트를 포함시킵니다.
include("utils", "networking", "ui")
// 플러그인 관리 블록
pluginManagement {
// 플러그인의 버전 해상도 전략을 설정합니다.
resolutionStrategy {
// 각 플러그인에 대한 버전을 관리합니다.
eachPlugin {
// Spring Boot 플러그인에 대한 설정 예시
if (requested.id.id == "org.springframework.boot" && requested.version == null) {
// 버전이 지정되지 않았다면, 기본 버전을 사용합니다.
useVersion("2.7.6")
}
}
}
// 플러그인 저장소를 설정합니다.
// 여기서는 Gradle 플러그인 포털과 Maven 중앙 저장소를 사용합니다.
repositories {
gradlePluginPortal()
mavenCentral()
}
}
🔍 코드 분석:
- providers를 활용하여
gradleProperty
함수를 정의하였습니다. 이 함수는gradle.properties
파일의 값을 안전하게 가져옵니다. - rootProject를 이용해 최상위 프로젝트의 이름을 설정합니다.
- include 함수를 사용하여 세 개의 하위 프로젝트를 포함시켰습니다.
- pluginManagement 및 내부의 resolutionStrategy와 eachPlugin을 활용하여 플러그인의 버전 해상도 전략을 설정합니다.
- requested를 이용하여 요청된 플러그인의 정보에 접근하였습니다.
기술적인 내용을 최대한 쉽게 풀어서 설명하려 노력했습니다. Gradle의 Kotlin DSL은 매우 강력하면서도 유연합니다. 이를 통해 복잡한 프로젝트 구조와 플러그인 관리를 쉽게 핸들링할 수 있습니다.
resolutionStrategy
는 Gradle에서 의존성의 버전 해결 전략을 정의하는 방법입니다. 의존성의 버전 해결은 프로젝트에서 사용하는 여러 라이브러리나 플러그인의 버전을 결정하는 과정을 의미합니다. 프로젝트에는 여러 버전의 동일한 라이브러리가 존재할 수 있기 때문에, 이런 충돌이나 불일치 문제를 해결하기 위해 사용되는 것이 바로 해상도 전략(resolution strategy)입니다.
🌟 resolutionStrategy
의 주요 기능
- Forcing Versions: 특정 의존성의 버전을 강제로 설정할 수 있습니다. 예를 들어, 프로젝트에서 여러 버전의 동일한 라이브러리가 존재할 경우, 원하는 버전으로 강제 설정하여 충돌 문제를 해결할 수 있습니다.
resolutionStrategy { force("com.some.library:library-name:1.0.1") }
- Fail on Version Conflict: 버전 충돌이 발생할 경우 빌드를 실패하게 만들 수 있습니다. 이렇게 하면 버전 충돌 문제를 바로 인식하고 대응할 수 있습니다.
resolutionStrategy { failOnVersionConflict() }
- Dependency Substitution: 하나의 의존성을 다른 것으로 대체할 수 있습니다. 예를 들어, 개발 중인 로컬 버전의 라이브러리로 의존성을 대체하고 싶을 때 유용합니다.
resolutionStrategy { dependencySubstitution { substitute(module("com.some.library:old-library")) .with(module("com.some.library:new-library:1.0.1")) } }
- Component Selection Rules: 의존성의 선택 규칙을 추가할 수 있습니다. 예를 들어, 베타 버전보다 안정 버전을 선호하는 규칙을 추가할 수 있습니다.
resolutionStrategy { componentSelection { all { if (candidate.version.endsWith("-beta")) { reject("We don't use beta libraries") } } } }
해상도 전략은 프로젝트의 의존성 관리에 있어 중요한 역할을 합니다. 특히, 대규모 프로젝트나 여러 라이브러리와 플러그인을 사용하는 프로젝트에서는 이 전략 없이는 버전 관리가 어려울 수 있습니다. 따라서, 적절한 해상도 전략을 설정하여 프로젝트의 안정성을 높이는 것이 중요합니다.
'Language > Kotlin' 카테고리의 다른 글
Kotlin의 `any` 함수란? (0) | 2023.09.15 |
---|---|
[Kotlin Basic]let함수에 대해 (0) | 2023.09.15 |
DSL (Domain-Specific Language)이란? | feat. Kotlin DSL, build.gradle.kts 예시 코드) (0) | 2023.09.13 |
Gradle, Spring, Kotlin 환경에서의 build.gradle.kts 내 tasks 이해하기 (0) | 2023.09.13 |
`reified`란? (0) | 2023.09.04 |