Gradle 使用 SCM 的多项目

Gradle Multiproject with SCM

我正在迁移到 Gradle 作为 Java 项目的构建工具。 我的主项目 (A) 依赖于其他项目(B 和 C)。

目前,这些项目中的每一个都单独在 CVS 中,当我想编译 A 时,我必须签出 A,在 A 中创建一个名为 B 的子目录,我在其中签出 B。C 也是如此。

我将迁移到可以将 B 和 C 发布到的存储库管理器 (nexus)。当发生这种情况时,模块 A 可以只依赖于 B 和 C,它可以从 nexus 获得。

但是,如果我不想发布 B 和 C(用于测试目的)并且我想用 B 和 C 的最新代码构建 A 而不将其提交到 nexus,就会出现困难。

我最初的想法是为 B 和 C 构建 jar 并将其拉入 A 的 "lib" 文件夹中。但是我确信有更好的方法。

在 maven 中,我可以做一个 "mvn clean install",它会在我的本地 maven 缓存中安装 B 和 C。然后 A 会在那里寻找合适的罐子。

但我仍然不确定这是最好的方法。我查看了 gradle 个子项目,但我并不完全理解它们。子模块如何在 SCM 中处理(我是否还需要使用 git 个子模块?)

对于这种情况下的最佳做法,我将不胜感激。 谢谢

编辑:

下面 Vyacheslav Shvets 的回复是我迄今为止找到的最准确的答案。 还有另一种方法可以将 gradle 项目依赖项切换为 maven 样式依赖项。这涉及 https://docs.gradle.org/current/userguide/dependency_management.html#sec:project_to_module_substitution

中描述的依赖替换

这可以绕一个:

if(project.hasProperty("someSwitch")){
    configurations.all{.....
    ....
    }
 }

这个方法的用法是:

gradle build -Psomeswitch

老(经典)方式

与 Maven 相同的方法:

  1. 在项目上应用 maven 插件 B
  2. 运行 gradle clean install 项目 B

    实际上,如果您的构建正确使用任务输入和输出,您不必每次都clean

  3. 在项目 A 中,添加 mavenLocal() 存储库和 运行 构建

新方法(实验性)- 复合构建

A composite build allows you to combine multiple Gradle builds and replace external binary dependencies with project dependencies as if you were using a single multi-project build https://docs.gradle.org/2.13/release-notes

这还没有完全可用。从 2.13 开始,您可以通过工具 API 使用它(例如,Eclipse IDE 的 Buildship 2.0 插件)。常用用法将在 3.1 中可用,但您现在可以使用 nightly builds of 3.1

来尝试

如果您使用最新的每晚构建下载并执行 demo build from Gradle's github,您将看到以下内容:

$ gradle build
[composite-build] Configuring build: C:\Users\Shvets\repos\composite\projectB
[composite-build] Configuring build: C:\Users\Shvets\repos\composite\projectC
:compileJava
:projectB:b1:compileJava
:projectB:b1:processResources UP-TO-DATE
:projectB:b1:classes
:projectB:b1:jar
:projectB:b2:compileJava
:projectC:compileJava
:projectC:processResources UP-TO-DATE
:projectC:classes
:projectC:jar
:projectB:b2:processResources UP-TO-DATE
:projectB:b2:classes
:projectB:b2:jar
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build

BUILD SUCCESSFUL

Total time: 4.497 secs

要深入了解,请参阅demo video of both approaches