Android中的Gradle版本目录

Gradle版本目录使我们能够以简单且可扩展的方式添加和维护依赖项。随着应用的增长,管理多个开发团队的项目会增加编译时间。

针对此问题的一种潜在解决方案是将项目分割为多个模块。并行编译这些模块,并且仅重新编译已修改的部分,可以减少总体编译时间。然而,问题随之而来:如何在避免编译错误和手动检查每个模块的Gradle文件以防止同步问题的同时,有效地共享通用库依赖及其相应版本?

Gradle版本目录帮助我们将所有依赖项集中在一个具有安全类型的单一文件中,可以从各个模块调用。

创建版本文件

首先,我们需要在Gradle文件夹中创建文件。按照惯例,我们使用Android开发指南推荐的名称libs.version.toml

该文件将包含三个部分:

 

[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原则(不要重复自己),因此我们将创建一个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)
}

通过这些步骤,我们可以创建插件来整合依赖,例如:

  • 组合
  • 风味
  • 特性
  • 依赖注入
  • 数据库
  • 测试

注意事项

Gradle版本目录目前仍在全面开发中,关注Android发布的已知错误和限制是明智之举。本文中的示例展示了Gradle版本目录的优势,以及它们如何简化我们的工作。若想了解其实际应用,可立即前往GitHub查看针对Android的案例。

Source:
https://dzone.com/articles/gradle-version-catalogs-on-android