【发布时间】:2019-05-22 08:16:05
【问题描述】:
我有多个大致这种布局的应用项目:
- 示例应用程序 (Java)
- 具有附加功能的 Java 包装器
- C++ + 浅层 Java 包装器
- 具有附加功能的 Java 包装器
- 第二个示例应用程序(颤振)
- 颤振包装器
- 具有附加功能的 Java 包装器
- C++ + 浅层 Java 包装器
- 具有附加功能的 Java 包装器
- 颤振包装器
- 第三个示例应用程序
- 颤振包装器
- 具有附加功能的 Java 包装器
- C++ + 浅层 Java 包装器
- 具有附加功能的 Java 包装器
- 颤振包装器
所有应用程序共享相同的主要依赖项(具有附加功能的 java Wrapper)及其依赖项树。现在我正在开发每个应用程序,一直到 C++ 代码。它们在各自的父项目中作为 git 子模块进行管理。
由于整个过程的变化率很高,我希望构建最后一个示例,以便从所有来源进行测试。
我尝试了几种方法将其整合到一个 gradle 构建中:
1。首选(但失败)解决方案:每个项目中的settings.gradle,每个项目只包含直接依赖项
现在我希望在一个 Flutter 构建中管理这棵完整的树。所以我在每个项目的settings.gradle中添加了直接依赖,只是为了了解gradle only supports one toplevel settings.gradle。所以这不起作用。上述问题中提出的解决方案主要尝试模拟对多个 settings.gradle 文件的支持。
2。 Functioning but Ugly: 添加所有依赖项目都包含在顶层settings.gradle中
当每个子项目都完全了解其依赖关系时,我真的必须手动将所有子项目包含在顶层settings.gradle 中吗?此外,由于有多个项目依赖于此,我是否必须为每个项目手动执行此操作?
(甚至不要让我开始关于 gradle 不告诉我,我有一个错误的 projectDir,因为我在递归下降的第 100 级有错字!)
3。可能可行的解决方案:使用复合构建
这将触发构建,但现在我必须解决构建工件而不是项目。其他工件也有同样的问题。
4。可能可行的解决方案:将依赖项项目发布到 maven(或其他)存储库并将其拉入应用程序
我没有尝试这个,因为我觉得这个想法令人厌恶:我想测试 C++ 代码中的一个小改动,现在必须将它推送到存储库,并且可能对上面的每个项目都做同样的事情? 这适用于稳定的项目,但不适用于灵活的探索性开发。当然,我想在最后发布一些东西,但我不想发布中间的每一步。
这让我想知道:我在做一些不寻常的事情吗?我的意思是:没有人有 gradle 似乎无法满足的相同要求:
- 实时更新一直到快速测试本地更改
- 顶层不重复传递依赖
这种情况下的常见做法是什么?
【问题讨论】:
-
不重复传递依赖 我猜你说的是
settings.gradle文件中的include语句,但请注意,你不是这样定义依赖的,但构建内部的项目。此时没有层次结构,因此没有依赖关系。如果您的项目在层次结构的每个级别上都非常分离,请使用复合构建。否则,请考虑更扁平的项目层次结构。 -
@LukasKörfer 我不确定它们是否会被视为强解耦。正如我所描述的,我想迭代地共同开发子项目,而不会在两者之间有一个大的发布循环。在我看来,复合构建会产生本地可用的 .aar 文件,我必须再次在顶级项目中找到这些文件,所以我没有赢得任何东西。
you do not define dependencies this way:我是 gradle 新手。我只想说:每个项目都需要来自子项目的东西。因此,它们对我来说看起来像是依赖项,不是吗?
标签: java android gradle android-gradle-plugin