У нас есть следующий файл каталога версий Gradle libs.version.toml
:
[libraries]
androidx-compose-material3 = { module = "libs.androidx.compose.material3", version = "1.2.1" }
Как мне ссылаться на вышеуказанную библиотеку внутри плагина Gradle:
class ExamplePlugin : Plugin<Project> {
override fun apply(target: Project) {
target.dependencies {
implementation(libs.androidx.compose.material3)
}
}
}
Я получаю сообщение об ошибке: Unresolved reference: libs
Типобезопасные методы доступа из каталогов версий недоступны (и не будут) в плагинах обычных классов, поскольку такие плагины компилируются изолированно.1
Вы можете получить доступ к каталогу версий небезопасным способом, используя расширение VersionCatalogsExtension. Например (с использованием кода Kotlin с API Kotlin DSL):
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)
}
}
}
}
Этот подход упоминается в документации Gradle.
Примечание. Я использовал синтаксис add, а не implementation
, потому что я не верю, что аксессор implementation
доступен и внутри плагина класса (аналогично каталогу версий, плагин класса не может знать, что такая конфигурация существует автоматически). ).
1 Похоже, Gradle планирует добавить их в предварительно скомпилированные плагины сценариев, которые вы пишете в файлах сценариев, а не в обычном коде. См. выпуск GitHub