2016-08-13 71 views
0

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

目前,这些项目都是在CVS单独当我想要编译AI不得不签出,做一个子目录中一个称为B中,我检查出B.同去的C.

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

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

我最初的想法是为B和C构建jar并将其拉入到“lib”文件夹中,但是我确定有更好的方法。

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

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

对于这种情况的最佳实践,我将不胜感激。 感谢

编辑:

从维亚切斯拉夫·什韦茨下面的回复是最准确的答案到目前为止,我已经找到。 还有一种方法可以用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

旧(古典)方式

与Maven相同的方法:

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

    其实,你不必clean每次如果构建正确使用任务的输入和输出

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

的新途径(experemental) - 复合构建

复合构建允许你结合多种摇篮构建和更换项目依赖外部二进制依赖,如果你是使用一个多项目build 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