Каталоги версий Gradle в Android

Версии каталогов 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