十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
大家好,我是飘渺。今天继续更新DDD&微服务专栏,本篇主要与大家分享一下在多人团队中如何更好地组织代码和版本控制。

十年的东乃网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都营销网站建设的优势是能够根据用户设备显示端的尺寸不同,自动调整东乃建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联从事“东乃网站设计”,“东乃网站推广”以来,每个客户项目都认真落实执行。
首先,看看在多模块多团队的情境下,应该如何合理组织代码。
以Dailymart项目为例,目前的代码组织方式是将所有的业务模块和基础组件都存放在一个代码仓库中,这种做法在小团队中较为常见,而且许多开源微服务脚手架也采用了这种组织结构。
然而,遗憾的是,这种代码组织方式只适合小团队的使用。在涉及多个团队的大型项目中,每个团队负责独立的开发模块时,这样的代码组织结构很可能会引发问题。
在多模块多团队的开发中,每个模块的发布日期和上线范围可能各不相同。为了解决这个问题,通常需要在开发过程中创建多个分支,这导致多个分支版本并存的情况。
这样的情况下,每次上线都需要协调各团队进行分支代码合并。例如,从各自的特性Feature分支合并到一个统一的测试分支,然后从测试分支构建部署镜像进行发布。然而,合并过程中一旦出现代码冲突,就需要找相关人员进行代码合并,这不仅耗时耗力,而且容易出错。(我曾参与过一个多团队项目开发,每次上线都是鸡飞狗跳)
因此,在多团队开发时,我们建议按照业务模块进行代码拆分,将每个业务模块的代码存放在独立的代码仓库中。
这样,尽管各自团队可能仍然存在多分支开发的情况,但不再需要进行统一的合并,从而极大地提高了开发部署的效率。
同时,需要将所有公共组件也放置于一个单独的代码仓库中,业务模块按需引入即可。
接下来以Dailymart为例,介绍一下代码如何拆分:
1、DailyMart项目中包含了用户、订单、购物车、库存、商品等多个模块,这些模块按照普通SpringBoot项目的形式组织代码,并存放在不同的代码仓库中。
2、将基础组件模块dailymart-starter和dailymart-dependencies模块共同放置到另外一个单独的仓库中,业务模块根据需要引入各自需要的组件。
在大型项目中,需要统一规划依赖组件的版本,在Maven项目中通常通过BOM(Bill Of Materials)来实现。
BOM全称是Bill Of Materials,译作材料清单。BOM本身并不是一种特殊的文件格式,而是一个普通的POM文件,只是在这个POM中,我们罗列的是一个工程的所有依赖和其对应的版本。该文件一般被其它工程使用,当其它工程引用BOM中罗列的jar包时,不用显示指定具体的版本,会自动使用BOM对应的jar版本。
在Dailymart项目中,dailymart-dependencies就是一个BOM,在该文件中定义了项目所需组件的版本。其他模块只需在pom文件的dependencyManagement中引入bom依赖,后面引入定义好的组件时就不再需要指定版本了。
  
        
          
            com.jianzh5   
            dailymart-dependencies   
            ${revision}   
            pom   
            import   
           
      
 
   
      com.google.guava   
      guava   
     
 当项目中有多个公共组件时会出现这样一个问题,每个公共组件定义的版本可能不一样。比如dailymart-common-spring-boot-starter的版本是1.0.0,dailymart-cache-spring-boot-starter的版本是1.0.1,这样就导致项目的依赖管理变得比较混乱。
推荐的解决办法是使用 revision 占位符统一管理基础组件版本。
1、在pom文件中定义属性
  
    2024.0.0-SNAPSHOT 
 2、定义组件时直接使用revision变量作为版本号
  
    com.jianzh5   
    dailymart-boot   
    ${revision}   
   
  
dailymart-starter 3、在bom文件中通过revision占位符引入公共组件
  
    
   
   
  com.jianzh5   
  dailymart-common-spring-boot-starter   
  ${revision}   
  
 
   
     com.jianzh5   
     dailymart-ddd-spring-boot-starter   
     ${revision}   
  
   
  
 这样,若公共组件需要修改版本,只需修改 revision 变量的值,各组件版本就会统一变更,非常方便。
不过使用这种方式在公共组件模块执行 maven install 或 maven deploy 时会出现问题,推送到maven仓库中的pom文件仍然使用 revision 变量,业务模块无法直接引用。
此时我们需要借助Maven插件 flatten-maven-plugin,使其在 install 或 deploy 时自动将 revision 替换成具体的版本号。
  
      
          
            org.codehaus.mojo   
            flatten-maven-plugin   
            ${maven-flatten.version}   
              
                true   
                resolveCiFriendliesOnly   
               
              
                  
                    flatten   
                      
                        flatten   
                       
                    process-resources   
                   
                  
                    flatten.clean   
                      
                        clean   
                       
                    clean   
                   
               
           
       
 在pom文件添加此插件后,执行 install 时会生成一个名为 .flattened-pom.xml 的文件,打开文件后可以看到 revision 变量已经全部替换成了具体的版本号。
图片
在将自定义组件推送到maven仓库时,可以选择两种不同版本:Release版本和Snapshot版本。这两者应该如何选择呢?
两者区别的区别如下:
简而言之:Release版本是正式版,有bug不能再继续使用这个版本号,需要配合开发方修改版本号;Snapshot版本是快照版,有bug可以继续使用同一版本号,可以自动升级。
如果是内部开发项目,推荐使用Snapshot版本,即定义组件时在版本号后面加上 -SNAPSHOP 标识符,这样搭配上DevOps会非常方便;如果是需要对外发布的组件,还是需要使用Release版本发布。
本文介绍了在多人团队协作中更有效地组织代码和进行版本控制的方法,希望对你有所帮助!