Gradle 플러그인 변형 지원
Gradle 플러그인 변형 지원
Kotlin Gradle 플러그인(KGP)이 Gradle 버전별로 어떻게 서로 다른 변형을 제공하는지 알아볼게요. 최신 Gradle 기능을 지원하면서 구버전 Gradle과의 호환성도 유지하는 방법을, 실제 설정 코드와 함께 설명해드릴게요.
본문
Gradle 7.0은 Gradle 플러그인 작성자를 위한 새로운 기능 — 변형이 있는 플러그인(plugins with variants) — 을 도입했어요. 이 기능은 최신 Gradle 기능에 대한 지원을 추가하면서도 구버전 Gradle과의 호환성을 유지하기 쉽게 해줘요. Gradle의 변형 선택(variant selection)에 대해 더 알아보세요.
Gradle 플러그인 변형 덕분에 Kotlin 팀은 서로 다른 Gradle 버전을 위해 서로 다른 Kotlin Gradle 플러그인(KGP) 변형을 제공할 수 있어요. 목표는 가장 오래된 지원 Gradle 버전에 해당하는 main 변형에서 기본 Kotlin 컴파일을 지원하는 거예요. 각 변형에는 해당 릴리스의 Gradle 기능 구현이 들어 있어요. 최신 변형은 최신 Gradle 기능 세트를 지원하고, 이 접근 방식으로 제한된 기능을 가진 구버전 Gradle에 대한 지원을 확장할 수 있어요.
현재 Kotlin Gradle 플러그인에는 다음과 같은 변형들이 있어요:
| Variant's name | Corresponding Gradle versions |
|---|---|
main |
7.6.0–7.6.3 |
gradle80 |
8.0–8.0.2 |
gradle81 |
8.1.1 |
gradle82 |
8.2.1–8.4 |
gradle85 |
8.5 |
gradle86 |
8.6-8.7 |
gradle88 |
8.8-8.10 |
gradle811 |
8.11-8.12 |
gradle813 |
8.13-8.14 |
gradle96 |
9.6-9.7 |
앞으로의 Kotlin 릴리스에서 더 많은 변형이 추가될 거예요.
빌드가 어떤 변형을 사용하는지 확인하려면 --info 로그 레벨을 활성화하고 출력에서 Using Kotlin Gradle plugin으로 시작하는 문자열을 찾아보세요. 예를 들어 Using Kotlin Gradle plugin main variant처럼요.
문제 해결
커스텀 구성에서 Gradle이 KGP 변형을 선택할 수 없어요
커스텀 구성에서 Gradle이 KGP 변형을 선택하지 못하는 것은 예상된 상황이에요. 커스텀 Gradle 구성을 사용한다면:
configurations.register("customConfiguration") {
// ...
}
configurations.register("customConfiguration") {
// ...
}
그리고 Kotlin Gradle 플러그인에 의존성을 추가하고 싶다면, 예를 들어:
dependencies {
customConfiguration("org.jetbrains.kotlin:kotlin-gradle-plugin:2.4.20")
}
dependencies {
customConfiguration 'org.jetbrains.kotlin:kotlin-gradle-plugin:2.4.20'
}
customConfiguration에 다음 속성들을 추가해야 해요:
configurations {
customConfiguration {
attributes {
attribute(
Usage.USAGE_ATTRIBUTE,
project.objects.named(Usage.class, Usage.JAVA_RUNTIME)
)
attribute(
Category.CATEGORY_ATTRIBUTE,
project.objects.named(Category.class, Category.LIBRARY)
)
// If you want to depend on a specific KGP variant:
attribute(
GradlePluginApiVersion.GRADLE_PLUGIN_API_VERSION_ATTRIBUTE,
project.objects.named("7.0")
)
}
}
}
configurations {
customConfiguration {
attributes {
attribute(
Usage.USAGE_ATTRIBUTE,
project.objects.named(Usage, Usage.JAVA_RUNTIME)
)
attribute(
Category.CATEGORY_ATTRIBUTE,
project.objects.named(Category, Category.LIBRARY)
)
// If you want to depend on a specific KGP variant:
attribute(
GradlePluginApiVersion.GRADLE_PLUGIN_API_VERSION_ATTRIBUTE,
project.objects.named('7.0')
)
}
}
}
그렇지 않으면 다음과 비슷한 오류를 받게 돼요:
> Could not resolve all files for configuration ':customConfiguration'.
> Could not resolve org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.0.
Required by:
project :
> Cannot choose between the following variants of org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.0:
- gradle70RuntimeElements
- runtimeElements
All of them match the consumer attributes:
- Variant 'gradle70RuntimeElements' capability org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.0:
- Unmatched attributes:
다음 단계는?
Gradle 기본과 세부사항에 대해 더 알아보세요.