我正在迁移到Gradle作为Java项目的构建工具。 我的主要项目(A)依赖于其他项目(B和C)。
目前,每个项目都是单独的CVS,当我想要编译A时,我必须检查A,在A中创建一个名为B的子目录,其中我查看了B.同样适用于C.
我将迁移到存储库管理器(nexus),其中可以发布B和C.当发生这种情况时,模块A可以只依赖于它可以从nexus获得的B和C.
然而,如果我不想发布B和C(用于测试目的)并且我想使用来自B和C的最新代码构建A而不将其提交给nexus,则会出现困难。
我对此的初步想法是为B和C构建jar并将其拉入A的“lib”文件夹。但我确定有更好的方法。
在maven我可以做一个“mvn clean install”,它会在我的本地maven缓存中安装B和C.然后A会在那里找到合适的罐子。
但我仍然不确定这是最好的方法。我看了一下gradle子项目,但我不完全理解它们。如何在SCM中处理子模块(我还需要使用git子模块吗?)
对于这种情况的最佳做法,我将不胜感激。 感谢
修改
以下来自Vyacheslav Shvets的答复是我迄今为止找到的最准确的答案。 还有另一种方法可以使用maven样式依赖关系切换gradle项目依赖项。这涉及https://docs.gradle.org/current/userguide/dependency_management.html#sec:project_to_module_substitution
中描述的依赖替换这可以包含在:
if(project.hasProperty("someSwitch")){
configurations.all{.....
....
}
}
此方法的用法是:
gradle build -Psomeswitch
答案 0 :(得分:0)
旧(经典)方式
与Maven相同的方法:
maven
B
插件
在项目gradle clean install
B
实际上,如果构建正确使用任务输入和输出,则每次都不必clean
在项目A
中,添加mavenLocal()
存储库并运行构建
新方式(实践) - 复合构建
复合构建允许您组合多个Gradle构建并将外部二进制依赖项替换为项目依赖项,就像使用单个多项目构建一样 https://docs.gradle.org/2.13/release-notes
尚未完全推出。从2.13开始,您可以通过Tooling 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。