빌드 파일은 직접 종속 항목을 지정하지만 이러한 각 종속 항목에는 다른 종속 항목이 필요할 수 있습니다. 이러한 전이 종속 항목은 종종 충돌하는 버전으로 전반적인 종속 항목 그래프를 빠르게 확장합니다.
minor
(새로운 기능) 또는 patch
(버그 수정) 부분이 변경되면 라이브러리가 계속 호환될 가능성이 높고 애플리케이션에 영향을 미칠 가능성도 적습니다.
예를 들어 애플리케이션이 라이브러리 A와 라이브러리 B에 종속되고 이 라이브러리는 서로 다른 버전의 라이브러리 C에 종속된다고 가정해 보겠습니다.
이 경우 Gradle은 기본적으로 최신 버전의 라이브러리 C를 선택하므로 컴파일 또는 런타임 문제가 발생할 수 있습니다. 이 예에서 라이브러리 C는 2.1.1로 확인되었지만 라이브러리 A는 라이브러리 C 1.0.3을 요청했다는 점에 유의하세요. 버전 번호의 주요 부분이 변경되어 삭제된 함수나 유형과 같은 호환되지 않는 변경사항을 나타냅니다. 이로 인해 라이브러리 A에서 이루어진 호출이 비정상 종료될 수 있습니다.
앱에 전이 종속 항목이기도 한 직접 종속 항목이 있을 수 있습니다.
이 경우 최신 전이 종속 항목이 앱에서 직접 요청하는 버전을 재정의할 수 있습니다.
Gradle은 그래프의 모든 종속 항목에 대해 모든 후보 버전을 확인하여 각 종속 항목의 최신 버전을 결정합니다. 기본 Gradle 작업과 고급 도구를 사용하여 Gradle이 해결한 각 종속 항목의 버전을 확인할 수 있습니다. 이 해상도의 변경사항을 비교하는 것이 업그레이드의 위험을 이해하고 완화하는 데 중요합니다.
예를 들어 ./gradlew
app:dependencies
를 실행하여 Gradle dependencies
작업을 사용하여 앱 모듈에서 사용하는 모든 종속 항목의 트리를 표시할 수 있습니다. 그림 2와 같이 라이브러리를 사용하는 애플리케이션에 이를 실행하면 다음과 같이 표시됩니다.
1: releaseRuntimeClasspath - Runtime classpath of /release.
2: +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0
3: | +--- ... (omitted for brevity) ...
4: +--- com.sample:library.a:1.2.3
5: | +--- com.sample:library.c:2.1.1
6: | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 (*)
7: | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 (*)
8: +--- com.sample:library.c:1.4.1 -> 2.1.1 (*)
보고서의 이 부분은 releaseRuntimeClasspath
구성에서 결정된 일부 종속 항목을 보여줍니다.
종속 항목 보고서에 ->
가 표시되면 요청자(애플리케이션 또는 다른 라이브러리)가 예상하지 못한 종속 항목 버전을 사용하고 있는 것입니다. 대부분의 라이브러리는 이전 버전과의 호환성을 위해 작성되므로 대부분의 경우 문제가 발생하지 않습니다. 그러나 일부 라이브러리는 호환되지 않는 변경사항을 적용할 수 있으며, 이 보고서를 통해 애플리케이션 동작과 관련된 새로운 문제가 어디에서 발생하는지 확인할 수 있습니다.
Gradle의 종속 항목 보고 사용에 관한 자세한 내용은 종속 항목 보기 및 디버그를 참고하세요.
버전 카탈로그 또는 BOM에서 요청된 버전을 직접 지정할 수 있습니다.
직접 버전 사양 확인
지정한 종속 항목의 버전이 버전 확인의 후보가 됩니다.
예를 들어 app/build.gradle.kts
에서 androidx.compose.ui:ui
라이브러리의 버전 1.7.3을 종속 항목으로 요청하려면 다음을 실행합니다.
dependencies {
implementation("androidx.compose.ui:ui:1.7.3")
}
버전 1.7.3이 후보 버전이 됩니다. Gradle은 1.7.3 및 전이 종속 항목에서 요청한 동일한 라이브러리의 다른 버전 중에서 최신 버전으로 확인됩니다.
버전 카탈로그 해결
버전 카탈로그는 애플리케이션 전체에서 사용되는 종속 항목의 버전을 추적하는 변수를 정의합니다. 버전 카탈로그의 변수를 사용하면 해당 변수의 지정된 종속 항목이 버전 확인 후보에 추가됩니다. 버전 카탈로그에서 사용되지 않는 변수는 무시됩니다.
예를 들어 gradle/libs.versions.toml
파일에서 androidx.compose.ui:ui
버전 1.7.3을 종속 항목으로 지정하려면 다음을 실행합니다.
[versions]
ui = "1.7.3"
[libraries]
androidx-compose-ui = { group = "androidx.compose.ui", name = "ui", version.ref = "ui" }
이렇게 하면 라이브러리를 나타내는 libs.androidx.compose.ui
라는 변수가 정의됩니다. 이 변수를 사용하여 종속 항목을 지정하지 않는 한 이 버전은 후보로 간주되지 않습니다.
app/build.gradle.kts
에서 라이브러리 및 라이브러리 버전을 요청하려면 다음 안내를 따르세요.
dependencies {
implementation(libs.androidx.compose.ui)
}
Gradle은 직접 사양에 관해와 동일한 방식으로 해결합니다.
재료명세서 (BOM) 해결
BOM에 표시되는 모든 라이브러리의 버전이 버전 확인의 후보가 됩니다. 라이브러리는 직접 또는 간접으로 지정된 경우에만 종속 항목으로 사용됩니다. BOM의 다른 라이브러리는 무시됩니다.
BOM 버전은 직접 종속 항목은 물론 BOM에 표시되는 모든 전이 종속 항목에 영향을 미칩니다.
예를 들어 app/build.gradle.kts
에서 BOM을 platform 종속 항목으로 지정합니다.
dependencies {
implementation(platform("androidx.compose:compose-bom:2024.10.00"))
implementation("androidx.compose.ui:ui")
}
종속 항목으로 사용하려는 라이브러리에는 버전 사양이 필요하지 않습니다. 요청된 버전은 BOM에서 제공됩니다.
버전 카탈로그를 사용하여 BOM 및 라이브러리의 변수를 만들 수도 있습니다. BOM 종속 항목에 표시되는 라이브러리의 버전 카탈로그에서 버전 번호를 생략합니다.
예를 들어 버전 카탈로그에 BOM과 버전 번호가 포함되어 있지만 BOM에서 참조하는 라이브러리의 버전은 지정하지 않습니다.
[versions]
composeBom = "2024.10.00"
[libraries]
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" }
androidx-compose-ui = { group = "androidx.compose.ui", name = "ui" }
app/build.gradle.kts
은 버전 카탈로그에 정의된 변수를 사용하여 BOM 및 라이브러리를 참조합니다.
dependencies {
implementation(platform(libs.androidx.compose.bom))
implementation(libs.androidx.compose.ui)
}
BOM에 지정된 해당 라이브러리의 버전이 Gradle의 해상도 후보가 됩니다. 또한 BOM에 지정된 다른 모든 라이브러리 버전은 종속 항목으로 직접 사용되었는지 여부와 관계없이 후보 버전이 됩니다.
예를 들어 BOM이 라이브러리 A, B, C의 버전을 지정한다고 가정하겠습니다. 애플리케이션에서 라이브러리 D와 함께 라이브러리 A를 종속 항목으로 직접 사용하려 합니다. 라이브러리 D는 라이브러리 B를 종속 항목으로 사용합니다. 라이브러리 C를 사용하는 것은 없습니다.
라이브러리 A, B, D는 애플리케이션의 종속 항목이며 라이브러리 C는 무시됩니다. 라이브러리 B를 종속 항목으로 직접 지정하지 않더라도 Gradle은 BOM에 지정된 A 및 B 버전을 후보로 사용합니다.
라이브러리 D가 2.0.1보다 낮은 버전의 라이브러리 B를 요청하면 Gradle은 2.0.1로 확인됩니다. 라이브러리 D가 라이브러리 B의 상위 버전을 요청했다면 Gradle은 해당 버전으로 확인합니다.