首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >git子模块与maven工件

git子模块与maven工件
EN

Stack Overflow用户
提问于 2021-04-13 01:09:23
回答 1查看 867关注 0票数 1

由于目前的结构,我们的休息服务发展受到了阻碍和减缓。我试着在下面的图片中捕捉到它。对图表的一些解释

  • RestServiceA和RestServiceB是独立的github repos
  • v1有两个子模块。V1-生命周期和v1-使用。V1-生命周期取决于v1-utils。类似地,v2具有相同的依赖关系。
  • v1和v2都依赖于公共的,这是另一个maven模块。
  • v1和v2都是脱节的,这意味着他们不知道对方
  • RestServiceA需要来自v1-生命周期和v2-生命周期的代码,因此它直接依赖于它们。
  • RestServiceB只需要来自v2生命周期的代码,因此它直接依赖于它。

大多数代码都在v1或v2下。除资源、配置等之外,RestServiceA/B中没有太多的代码。所以,这里有一个紧密的耦合。

这种方法的问题是,对于给定的特性,比如v1,我需要构建jar,在RestServiceA中更新它的版本,然后进行测试。这需要对每一个新的提交重复。此外,我还需要发布自己的快照,以便在本地之外进行测试。

为了避免这种混乱,我正在考虑使用github子模块。然而,我的知识有限。如果下面的理解是正确的,如果我错过了任何明显的漏洞,如果选择这种方法的话,有人能帮忙吗?我愿意接受任何替代的方法。谢谢!

  • 如果有人正在进行本地更改,比如v1,他们将提交并执行github子模块更新,以获取最新的散列,比如RestServiceA和测试。这将比建造整个罐子快得多,并能按时上市。
  • 有时,我们需要测试产品开发人员的代码,以便进行A/B测试。在这些情况下,RestServiceA可以临时指向开发人员的特殊分支和分支,创建一个构建、测试和恢复。然而,我们如何避免开发人员在主要回购中不承诺使用.gitmodules?如果url/分支等更改,则可能编写单元测试并显式失败。
  • 我们仍然可以将maven工件作为发行版的一部分发布,因此如果RestServiceB、RestServiceC希望坚持使用工件而不是子模块,它们可以这样做。

EN

回答 1

Stack Overflow用户

发布于 2021-04-14 16:43:55

我们有一个类似的项目结构,最后得到了以下解决方案。

  1. 每个模块都有一个Git存储库(“模块存储库”)。在您的例子中,这将是您在文章中提到的所有存储库:
代码语言:javascript
复制
v1-lifecycle, v1-utils, v2-lifecycle, v2-utils, prd-common, RestServiceA, RestServiceB, RestServiceC
  1. 每个模块存储库都包含一个可以构建independently,的常见Maven项目--这或多或少与您现在拥有的差不多,但是.
  2. ...The模块存储库做的是而不是有子模块,它们只相互引用为Maven依赖项。
  3. 在每次推到模块存储库时,如果测试通过(如果没有),CI会将新工件上传到Maven。
  4. 除了模块存储库之外,还有一个(“父”) Git存储库,它包含插入到其树中的其他模块存储库(我将在下面解释它的意思)。因此,父存储库在某种意义上包含所有代码。
  5. 父存储库的pom.xml使用Maven的<modules>标记在其树中包含所有其他模块:
代码语言:javascript
复制
    <modules>
        <module>module1</module>
        ...
        <module>moduleN</module>
    </modules>

父存储库的树结构如下所示:

代码语言:javascript
复制
├── module1
├── ...
├── moduleN
└── pom.xml

这允许我们在提交之前构建和测试所有项目,在使用mvn testmvn integration-testmvn package发布工件之前对进行测试。

而且,当IDE打开所有代码时,这种体系结构使得跨模块重构更加容易。因此,我们直接从父存储库进行所有的开发。

我在一个只有两个模块的小例子上写了一个描述这个设置的文章

我们正在开发的项目是Git X-模 (是Git子模块的替代品),它使用自己而不是Git子模块将模块存储库插入到父存储库的树中。

因此,通过将模块存储库插入父存储库,我的意思是使用以下两种方法:

  • Git子模;或
  • Git X-模块,如果你像我们一样选择那种方式

若要在父存储库根目录创建module1.moduleN目录,请执行以下操作。

区别在于,对于Git子模块,父存储库根部的module1.moduleN目录将是指向它们相应的Git存储库的链接。例如,如果我们从父存储库中更改它们,则必须提交并推入每个单独的模块存储库中。

对于Git,它们都只是普通的Git目录,所以我们只能提交和推送一次,并且在服务器端将推送转换成单独的module1.moduleN存储库。我希望你明白这个想法。在这种情况下,分支也更容易。

关于最后一个问题,afaiu是需要的,因为您不想在提交更改之前测试它们。当拥有带有Maven模块的父存储库时,您可以只运行"mvn测试“、"mvn集成测试”,甚至可以在提交和推送之前对所有更改执行手动测试,因此,正如我所理解的,这个问题变得无关紧要了。

在最坏的情况下,开发人员可以直接在父存储库中创建一个新分支,并只推动该分支对其进行CI测试,然后合并分支(或者从分支中选择)--一切都很好。不需要临时上传到Maven。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67067465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档