Переношу версии в gradle/libs.versions.toml, а общие настройки держу в convention-плагинах в buildSrc. Задумка была в том, чтобы у версий было одно место. Три случая по порядку.
В скрипте сборки подпроекта работают и alias(libs.plugins.kotlin.jvm), и libs. Претензий нет.
Скрипт сборки самого buildSrc каталог основного проекта не наследует. Его надо подключить руками в buildSrc/settings.gradle.kts.
dependencyResolutionManagement {
versionCatalogs {
create("libs") {
from(files("../gradle/libs.versions.toml"))
}
}
}
Пока всё по документации. Немного странно объяснять buildSrc, где в его же репозитории лежит файл, но работает, и аксессоры появляются.
С третьего случая начинается невесёлое. В прекомпилированном скриптовом плагине внутри buildSrc типобезопасного libs нет. Документация предлагает доставать каталог по имени через extensions.getByType(VersionCatalogsExtension::class.java).named("libs") и потом спрашивать каждую запись по псевдониму. А блок plugins такого плагина до каталога вообще не дотягивается, так что convention-плагин, который применяет другой плагин, называет его по id, а версия приходит оттуда, где buildSrc объявил артефакт плагина.
Картина неровная. Самые неважные скрипты сборки получают самые удобные аксессоры. Convention-плагины, где теперь живёт большая часть общих настроек, получают поиск по строкам.
Так что одно место, где записи достаются по имени, остаётся всегда. Тут начинаешь думать, не честнее ли держать координаты внутри convention-плагинов просто строками.