Версии каталогов Gradle позволяют нам добавлять и поддерживать зависимости простым и масштабируемым способом. Приложения растут, и управление проектами с несколькими командами разработчиков увеличивает время компиляции.
Одно из возможных решений этой проблемы заключается в разбиении проекта на несколько модулей. Компиляция этих модулей параллельно и только перекомпиляция измененных частей уменьшает общее время компиляции. Однако возникает дилемма: как мы можем эффективно делиться общими зависимостями библиотек и их соответствующими версиями, избегая ошибок компиляции и необходимости ручного просмотра файлов Gradle в каждом модуле для предотвращения проблем синхронизации?
Каталоги версий Gradle помогают нам централизованно хранить все зависимости в одном файле с безопасным типом, который можно вызвать из ваших модулей.
Создание файла версий
Во-первых, мы должны создать наш файл в папке Gradle. По соглашению, мы используем имя libs.version.toml
, рекомендованное в руководствах по разработке Android.
Этот файл будет иметь три раздела:
[versions]
[libraries]
[plugins]
- Версии. Определяет версии ваших зависимостей и плагинов, которые используются в двух других блоках
- Библиотеки. Содержит зависимости.
- Плагины. Содержит плагины.
Давайте определим, например, версию и зависимости библиотеки внедрения зависимостей Koin.
[versions]
koin = "3.4.0"
[libraries]
koin-core = { group = "io.insert-koin", name = "koin-core", version.ref = "koin" }
koin-android = { group = "io.insert-koin", name = "koin-android", version.ref = "koin" }
koin-androidx-compose = { group = "io.insert-koin", name = "koin-androidx-compose", version.ref = "koin" }
koin-androidx-workmanager = { group = "io.insert-koin", name = "koin-androidx-workmanager", version.ref = "koin" }
koin-test = { group = "io.insert-koin", name = "koin-test", version.ref = "koin" }
koin-test-junit4 = { group = "io.insert-koin", name = "koin-test-junit4", version.ref = "koin" }
Затем, чтобы вызвать зависимость из любого модуля, нам нужно будет сделать следующее:
Dependencies {
implementation(libs.koin.core)
implementation(libs.koin.android)
}
Создайте свои плагины, и все ваши модули всегда будут синхронизированы
Когда уже перенесли зависимости, возникает проблема. Все наши модули, которым нужен Koin, должны повторять одни и те же строки. Здесь мы видим яркий пример DRY (Don’t Repeat Yourself), и мы создадим плагин Gradle, чтобы избавиться от повторения включения этих зависимостей.
В нашем файле build.gradle.kts
мы сможем регистрировать наши плагины Gradle.
gradlePlugin {
plugins {
register("koin") {
id = "example.android.koin"
implementationClass = "AndroidKoinConventionPlugin"
}
}
}
Затем создадим наш плагин и добавим зависимости этого плагина с помощью GVC.
class AndroidKoinConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
val libs = extensions.getByType<VersionCatalogsExtension>().named("libs")
dependencies {
"implementation"(libs.findLibrary("koin.core").get())
"implementation"(libs.findLibrary("koin.android").get())
"implementation"(libs.findLibrary("koin.androidx.compose").get())
"implementation"(libs.findLibrary("koin.androidx.workmanager").get())
"testImplementation"(libs.findLibrary("koin.test").get())
"testImplementation"(libs.findLibrary("koin.test.junit4").get())
}
}
}
}
Остаётся только вызвать в наших модулях плагин Koin, и если когда-нибудь придётся обновить версию, достаточно будет обратиться к нашему файлу определений, и все они обновятся при синхронизации Gradle. Например, файл модуля данных со всеми его зависимостями
plugins {
id("example.android.library")
id("example.android.koin")
}
android {
namespace = "com.example.core.data"
}
dependencies {
implementation(libs.kotlinx.coroutines.android)
}
С этим можно создавать плагины, которые группируют зависимости, например:
- Библиотека
- Compose
- Варианты
- Функциональность
- DI
- База данных
- Тест
Рассмотрение
Версии каталогов Gradle находятся еще в стадии полного развития, и полезно следить за известными ошибками и ограничениями, которые публикует Android. Примеры в этой статье демонстрируют преимущества версий каталогов Gradle и то, как они могут облегчить нашу жизнь. Если вы ищете функциональное применение этого, вы можете увидеть его на GitHub сейчас для Android.
Source:
https://dzone.com/articles/gradle-version-catalogs-on-android