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 相同的方法:
- 在项目上应用
maven
插件 B
运行 gradle clean install
项目 B
实际上,如果您的构建正确使用任务输入和输出,您不必每次都clean
在项目 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。
我正在迁移到 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 相同的方法:
- 在项目上应用
maven
插件B
运行
gradle clean install
项目B
实际上,如果您的构建正确使用任务输入和输出,您不必每次都
clean
在项目
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。