android - 如何在 Maven 和本地构建依赖项之间切换
问题描述
我的标题不是很清楚,所以我会在提问之前描述我的情况:
我有许多库 (~15),其中一些相互依赖,还有一些应用程序 (~5) 依赖于这些库的各个子集。这些库托管在内部 Maven 站点上。这些应用程序中的大多数都在同一域内运行,并且在功能和使用的数据模型方面存在重叠。有时,添加一个特性意味着对层次树中间的库进行更改,为上游提供支持(朝向依赖树根的库),然后利用上游的更改(应用程序以及使用改变图书馆)。
我想要:
- 当我处理应用程序代码时,从 Maven 获取这些库
- 在我处理影响库的更改时,从我的项目中编辑和编译这些库
我目前的过程有点乏味:
- 签出库的源代码并将其放在我的应用程序代码(、、、
workspace/app_code
等workspace/lib1_code
)workspace/lib2_code
旁边 - 我将
include ':lib1_code'
,include ':lib2_code'
等添加到我的settings.gradle
(我已将这些注释掉,所以我只是根据需要打开和关闭它们) - 我
implementation "com.packages:lib1:1.2.3"
用implementation project(':lib1_code')
(等等)替换 - 我也在依赖库中做同样的事情。
正如您所看到的,这是一项繁重的工作,我的团队中没有人(包括我自己)喜欢这个过程。我希望能够使用一组属性来完成上述所有操作,例如buildLib1UseLocal=true
问题:
- 我的场景有多常见?
- gradle 是否支持这样的事情?
- 是否有另一个构建系统可以做到?
解决方案
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>'
}
}
}
推荐阅读
- android - 如何在每 5 分钟服务到活动后发送更新的数据?
- angular - 离子 - Http 发布请求数据保存错误
- python - 获取计数作为单独的结果属性 Django
- jquery - 如何将 id 传递给 jQuery onshow、onload
- javascript - 带有动态数字字段的表单问题
- python - 将成绩单保存到文件 python
- nativescript - RadAutoCompleteTextView 没有 DisplayMode = Plain 的公开事件
- python - 多个 Gstreamer 管道同时运行
- laravel - Laravel 自定义规则 required_if 和 required_without
- database - 如何实现可定制的时间表调度规则?