【问题标题】:How to detect when dependency library version updates exist in build.gradle in AndroidStudio project如何检测AndroidStudio项目的build.gradle中何时存在依赖库版本更新
【发布时间】:2016-11-09 06:42:51
【问题描述】:

我有一个带有两个模块(典型的前端应用程序和后端)的 android 项目。我有三个build.gradle 文件,每个模块一个,根目录一个。

我构建依赖项的方式是将所有版本提取到根级别 build.gradle 中的单独变量中

ext {
    // SDK and tools
    MIN_SDK_VERSION = 19
    TARGET_SDK_VERSION = 23
    COMPILE_SDK_VERSION = 23
    BUILD_TOOLS_VERSION = '24'

    // app dependencies
    GOOGLE_API_CLIENT_VERSION = '1.19.0'
    GOOGLE_PLAY_SERVICES_VERSION = '8.4.0'
    ANDROID_SUPPORT_LIB_VERSION = '23.1.0'
    [...]

    // backend dependencies
    [...]
}

稍后在我的说应用程序build.gradle 文件中使用

dependencies {
    [...]
    compile(group: 'com.google.oauth-client', name: 'google-oauth-client', version: rootProject.ext.GOOGLE_API_CLIENT_VERSION)
    /////////////////////////////////
    // Google Play Services explicit dependency
    compile(group: 'com.google.android.gms', name: 'play-services-auth', version: rootProject.ext.GOOGLE_PLAY_SERVICES_VERSION)
    compile(group: 'com.google.android.gms', name: 'play-services-plus', version: rootProject.ext.GOOGLE_PLAY_SERVICES_VERSION)
    [...]

    /////////////////////////////////
    // Local Testing
    testCompile(group: 'junit', name: 'junit', version: rootProject.ext.JUNIT_VERSION)
    testCompile(group: 'pl.pragmatists', name: 'JUnitParams', version: rootProject.ext.JUNIT_PARAMS_VERSION)
    [...]
}

注意:我在某处的教程中发现了这个想法,我认为它非常漂亮。

但是,我正在努力跟踪哪些 lib 版本可用,哪些是可升级的等等。由于我有一个合理大小的依赖项列表,因此跟踪这些事情变得越来越困难。好奇其他人是如何解决这个问题的。谢谢。

【问题讨论】:

  • 我写了gradle-versions-plugin 来检测更新。在我的项目中,我集中坐标,例如dependencies.gradle 在一个位置更新。
  • 感谢 vm @BenManes 这是一个很棒的工具,我肯定会采用你的集中化,并且它比我今天拥有的更进一步——我喜欢它(我还检查了您在 github 上的其余项目,非常酷!)。您能否将此作为官方答案移动,我会将其标记为已接受?谢谢

标签: android-studio gradle android-gradle-plugin build.gradle android-build


【解决方案1】:

我如何管理依赖项的摘要。

所有依赖定义都在gradle/dependencies.gradle 中定义,适用于所有项目和构建脚本。我通常将其分为三类。一个完整的例子是here

ext {
  versions = [
    caffeine: '2.3.1',
  ]
  test_versions = [
    testng: '6.9.12',
  ]
  plugin_versions = [
    versions: '0.13.0',
  ]

  libraries = [
    caffeine: "com.github.ben-manes.caffeine:caffeine:${versions.caffeine}",
  ]
  test_libraries = [
    testng: dependencies.create("org.testng:testng:${test_versions.testng}") {
      exclude group: 'junit'
    },
  ]
  gradle_plugins = [
    versions: "com.github.ben-manes:gradle-versions-plugin:${plugin_versions.versions}",
  ]
}

然后在我的根项目中,我将其引导为,

buildscript {
  apply from: "${rootDir}/gradle/dependencies.gradle"

  repositories {
    jcenter()
  }

  dependencies {
    gradle_plugins.each { name, dependency -> classpath dependency }
  }
}

allprojects {
  apply from: "${rootDir}/gradle/dependencies.gradle"

  repositories {
    jcenter()
  }
}

这允许将项目中的依赖项定义为,

dependencies {
  compile libraries.caffeine
}

为了检测更新的版本,我写了gradle-versions-plugin。这会通过在存储库中查询版本信息并将其与您的定义进行比较来生成报告。我经常手动运行它,但其他人在他们的 CI 中编写脚本并使用 json 或 xml 报告。

在我编写插件之后,还开发了一些其他方法。 Spring 的 dependency-management-plugin 与 Maven BOM 一起使用,Netfix 的 nebula-dependency-recommender-plugin 也是如此。 Netflix 使用gradle-dependency-lock-plugin 定义动态版本并生成锁定文件来修复版本。还有依赖版本警报服务,虽然一个简单的 CI 工作可能是等效的。

我从来没有使用过任何替代方案,因为它们看起来不那么直观(对我而言),在我有一个很好的解决方案多年后才出现,如果您来自 Maven,这是一种熟悉的方法。希望其他人可以阐明其他方法的好处。

【讨论】:

    猜你喜欢
    • 2015-03-28
    • 2016-08-11
    • 1970-01-01
    • 2021-05-09
    • 2019-10-10
    • 2021-11-22
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多