【问题标题】:Multi level Gradle projects with relative configuration具有相关配置的多级 Gradle 项目
【发布时间】:2015-04-08 06:10:11
【问题描述】:

是否可以在 gradle 中建立一个项目树,以便每个子树独立构建?

在示例目录(项目)结构中:

A
+  B1
   +  C1
   +  C2
+  B2
   +  C4
   +  C5

您应该能够自己构建 B1(将构建 C1 和 C2)以及 A(将构建所有 7 个项目)

问题1:A忽略B1配置

A/B1/setting.gradle:

include "C1", "C2"

在A中,执行“gradle projects”命令将显示B1,但不显示C1或C2。

问题2:相对依赖

如果 C1 依赖于 C2,则指定它的唯一方法是绝对路径。这意味着它适用于 A 或 B1,但不适用于两者:

project(':B1:C2') // works for B1 but not for A
or
project(':A:B1:C2') // works for A but not for B1

这种目录结构可行吗,我可以在其中分别构建 A、B1 和 B2?

【问题讨论】:

  • 你在使用像 Android Studio 这样的 IDE 吗?
  • 我正在使用 Eclipse。一切都很简单,所有源代码树都包含在内,一切都可以编译。

标签: java android gradle build.gradle


【解决方案1】:

AFAIK 根项目中只能有一个 settings.gradle,并且无法将分层项目分组为子组。

您可以在 settings.gradle 中设置多个级别:

include "b1",
        "b1:c1",
        "b1:c2",
        "b2",
        "b2:c4",
        "b2:c5"

如果你在 root 中执行 gradle,这将构建所有项目,但如果你在 b1 中执行它,它不会只构建 b1、c1 和 c2。

我不太确定你想在这里完成什么,但也许任务依赖可以解决你所追求的:

b1/build.gradle:

tasks.jar.dependsOn += [
    project(":b1:c1").tasks.jar,
    project(":b1:c2").tasks.jar
]

运行jar任务:

$ gradle -p b1 jar
:b1:compileJava UP-TO-DATE
:b1:processResources UP-TO-DATE
:b1:classes UP-TO-DATE
:b1:c1:compileJava UP-TO-DATE
:b1:c1:processResources UP-TO-DATE
:b1:c1:classes UP-TO-DATE
:b1:c1:jar
:b1:c2:compileJava UP-TO-DATE
:b1:c2:processResources UP-TO-DATE
:b1:c2:classes UP-TO-DATE
:b1:c2:jar
:b1:jar

BUILD SUCCESSFUL

Total time: 0.761 secs

【讨论】:

  • 谢谢。这将在很大程度上解决问题 1,但问题 2 仍然存在(如何指定子项目之间的构建依赖关系)。我们有许多使用源代码控制导入的独立模块(无工件存储库),因此我们需要以不同的组合构建它们。如果你把项目 A 看作一个应用程序,那么还有其他几个应用程序,每个应用程序都需要不同的子项目组合。看起来唯一的解决方案是保持所有子项目的平面目录结构,因此它们始终作为兄弟姐妹彼此相对。
  • 如果你按照我上面所做的那样做,你可以依赖其他深层层次结构中的其他项目——不过它需要你有一个带有 settings.gradle 的根项目。 b2/c4/build.gradle:dependencies { compile project(":b1:c1") }。应该工作
  • 您可能想看看的另一件事是设置您自己的 Artifactory 或 Nexus 并在那里发布工件,以便您可以像任何其他 Maven/Ivy 工件一样依赖它们。
  • 谢谢。 C1可以表达对C2的依赖吗
  • 我发布的所有内容都依赖于 A 的存在,因为它包含包含所有子项目的 settings.gradle。只要 A 是根项目,哪个项目可以依赖于哪个其他项目没有任何限制。我怀疑您正在尝试进行设置,其中将 A 中的 B1 和 B2 作为外部存储库包含在内。在那种情况下,我认为您将无法做到这一点,因为层次结构会有所不同(即:c1 如果 B1 是 root 而不是 :b1:c1 如果 A 是 root)。也许它对相对路径是可行的,但老实说我不知道​​ Gradle 是否支持。
猜你喜欢
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
  • 2022-10-05
  • 2011-10-23
  • 1970-01-01
相关资源
最近更新 更多