Gradle 多项目与 SCM

标签 gradle build.gradle git-submodules

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

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

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

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

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

在 maven 中,我可以执行“mvn clean install”,将 B 和 C 安装到我的本地 maven 缓存中。然后 A 会在那里寻找合适的 jar 。

但我仍然不确定这是最好的方法。我查看了 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

最佳答案

旧(经典)方式

与 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 开始,您可以通过 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 .

    关于Gradle 多项目与 SCM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38932548/

    相关文章:

    android - 在高层次上,gradle sync 在 Android 中如何工作?

    Git递归地向子模块添加 Remote

    git - 在 .gitmodules 中找不到路径的子模块映射

    git - Jenkins 和 Git 子模块的问题

    java - Gradle 在没有主类的情况下构建 Spring Boot 库

    java - gradle - 在 eclipse 的父项目 war 中部署子项目 jar

    Android Studio 2.0 - 此版本的 Android Studio 与使用的 Gradle 插件不兼容。尝试禁用即时运行

    android - React-Native(Android)-任务 ':app:transformClassesWithMultidexlistForRelease'的执行失败

    android - 带有口味配置的Gradle

    android - 错误24 13 Android Studio无法解决