首页 > 解决方案 > 如何在 Maven 和本地构建依赖项之间切换

问题描述

我的标题不是很清楚,所以我会在提问之前描述我的情况:

我有许多库 (~15),其中一些相互依赖,还有一些应用程序 (~5) 依赖于这些库的各个子集。这些库托管在内部 Maven 站点上。这些应用程序中的大多数都在同一域内运行,并且在功能和使用的数据模型方面存在重叠。有时,添加一个特性意味着对层次树中间的库进行更改,为上游提供支持(朝向依赖树根的库),然后利用上游的更改(应用程序以及使用改变图书馆)。

我想要:

我目前的过程有点乏味:

  1. 签出库的源代码并将其放在我的应用程序代码(、、、workspace/app_codeworkspace/lib1_codeworkspace/lib2_code旁边
  2. 我将include ':lib1_code',include ':lib2_code'等添加到我的settings.gradle(我已将这些注释掉,所以我只是根据需要打开和关闭它们)
  3. implementation "com.packages:lib1:1.2.3"implementation project(':lib1_code')(等等)替换
  4. 我也在依赖库中做同样的事情。

正如您所看到的,这是一项繁重的工作,我的团队中没有人(包括我自己)喜欢这个过程。我希望能够使用一组属性来完成上述所有操作,例如buildLib1UseLocal=true

问题:

  1. 我的场景有多常见?
  2. gradle 是否支持这样的事情?
  3. 是否有另一个构建系统可以做到?

标签: androidgradle

解决方案


Gradle 基于 Groovy,因此它提供了完整的脚本支持。您可以自行评估该属性:

dependencies {
    if (buildLib1UseLocal) {
        implementation project(':lib1_code')
    } else {
        implementation 'com.packages:lib1:1.2.3'
    }
}

Gradle 甚至提供了一个称为依赖替换的功能。它允许您以常规方式定义依赖项,但可以从其他来源解决它们:

dependencies {
    implementation 'com.packages:lib1:1.2.3'
}

configurations.all {
    resolutionStrategy.dependencySubstitution {
        if (buildLib1UseLocal) {
             substitute module('com.packages:lib1:1.2.3') with project(':lib1_code') because '<some reason>'
        }
    }
}

推荐阅读