We have the following Gradle Version Catalog file libs.version.toml
:
[libraries]
androidx-compose-material3 = { module = "libs.androidx.compose.material3", version = "1.2.1" }
How do I reference the above library inside a Gradle plugin:
class ExamplePlugin : Plugin<Project> {
override fun apply(target: Project) {
target.dependencies {
implementation(libs.androidx.compose.material3)
}
}
}
I get an error: Unresolved reference: libs
Type-safe accessors from version catalogs are not (and will not be) available in regular class plugins, since such plugins are compiled in isolation.1
You can access the version catalog in a non-type-safe fashion by using the VersionCatalogsExtension
. For example (using Kotlin code with Kotlin DSL API):
class ExamplePlugin : Plugin<Project> {
override fun apply(target: Project) {
val versionCatalog = target.the<VersionCatalogsExtension>().named("libs")
target.dependencies {
versionCatalog.findLibrary("androidx.compose.material3").ifPresent {
lib -> add("implementation", lib)
}
}
}
}
This approach is mentioned in the Gradle documentation.
Note: I've used the add
syntax rather than implementation
because I do not believe the implementation
accessor is available inside a class plugin either (similarly to a version catalog, a class plugin could not be aware that such a configuration exists automatically).
1 It looks Gradle has plans to bring them to the precompiled script plugins though, which you write in script files rather than regular code. See GitHub issue