Gradle コンベンションプラグイン(Convention Plugin) でバージョンカタログを利用する

blog1.mammb.com


はじめに

Gradle のバージョンカタログでは、ライブラリのバージョンなどが一元管理できるが、コンベンションプラグイン(Convention Plugin) 側では、定義したカタログが利用できない。

以下のバージョンカタログ定義を行っても

[versions]  
junit = "6.1.0"  
  
[libraries]  
junit = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" }  

buildSrc\src\main\kotlin\buildlogic.java-common-conventions.gradle.kts で以下のような定義はできない。

dependencies {
    testImplementation(libs.junit)
    // ...
}  

Make generated type-safe version catalogs accessors accessible from precompiled script plugins #15383 で Issue として挙げられているが、例によって、すぐに対応される望みは薄い。


ワークアラウンド

ワークアラウンドとして以下のハックで対応できる。

buildSrc\build.gradle.ktsimplementation でバージョンカタログ定義を追加する。

plugins {  
    `kotlin-dsl`  
}  
  
repositories {  
    gradlePluginPortal()  
}  
  
dependencies {  
    implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location))  
}

buildSrc\src\main\kotlin\ProjectExt.kt として以下を作成する。

import org.gradle.api.Project  
import org.gradle.kotlin.dsl.the  
  
val Project.libs get() = the<org.gradle.accessors.dm.LibrariesForLibs>()

これで buildSrc\src\main\kotlin\buildlogic.java-common-conventions.gradle.kts で以下のような定義が可能となる。

dependencies {
    testImplementation(libs.junit)
    // ...
}  

ProjectExt.kt を作成しない場合は以下のようにすることもできる。

val libs = the<org.gradle.accessors.dm.LibrariesForLibs>()
dependencies {
    testImplementation(libs.junit)
    // ...
}