Day941.仓库版本管理 -系统重构实战

news2024/10/1 17:20:44

仓库&版本管理

Hi,我是阿昌,今天学习记录的是关于仓库&版本管理的内容。

当代码以及团队达到一定的规模以后,这会给项目仓库和版本的管理带来诸多问题。

一张常见问题的表格,不妨“对号入座”,看看项目有没有“中招”。

在这里插入图片描述

一、仓库管理

常见的有单仓模式多仓模式

1、单仓模式

单仓模式 指的是所有的组件代码统一在一个版本仓库中管理,团队成员基于一个代码仓库来完成日常的开发活动,就像后面图里画得这样。

在这里插入图片描述

这种仓库管理的方式的优点简单,所有的代码在一起维护,团队所有成员能共享产品的所有代码。
由于所有代码都在一个仓库,所以代码集成方便,也便于团队统一代码规范
团队之间能共享到所有人的代码,方便大家了解项目的整体代码情况以及学习其他组件架构及代码设计。

但单仓库的缺点就是当代码及团队规模庞大时,会带来后面的问题

  1. 开发人员容易受到干扰,不能专注在自己所属的组件代码上。
  2. 如果缺少有效的架构守护以及代码检视,因为代码都在一起,开发人员都有权限修改,就非常容易导致架构腐化

2、多仓模式

多仓模式 指的是各个组件在独立的代码仓库中维护,团队成员基于自己负责的组件仓库开发,不需要拉取自己不关心的组件代码。

在这里插入图片描述

多仓模式的优点是开发人员能够专注在自己维护的组件的代码开发上,不用每次更新所有的仓库的代码。并且仓库的代码量及复杂性是可控的,不同团队可以维护自己的仓库,职责清晰

但是缺点是需要依赖拆分的组件足够独立,新增需求不用涉及跨组件修改,避免一个开发人员需要同时基于多个组件仓库开发。如果经常出现跨仓开发及修改代码,这样反而会降低开发效率。在实际项目中,具体采用哪种仓库管理策略,需要综合团队、代码规模和工程管理能力来考量。对于组件化架构来说,建议组件化项目初期采用单仓模式,等组件逐步稳定及团队规模达到一定的程度时,再考虑分离,即采用多仓模式。


二、版本管理

对于各个组件来说,直接都是依赖最新的代码,而并没有版本的概念。二进制依赖和之前源码依赖有什么不同,然后再一起动手对 Sharing 项目做二进制依赖改造

二进制依赖

二进制依赖 指的是组件之间不直接依赖源码,而是依赖组件编译生成的二进制文件,并且对这些二进制文件做版本管理,就像后面这样。

在这里插入图片描述
相比较源码依赖,在集成编译时,由于所有的依赖已经被编译成二进制的格式,所以可以有效提高版本的编译速度。这点是对于遗留系统改造的一个非常明显的收益。在之前的咨询项目中,见过大量的大型遗留系统,一次完整的编译都需要十几分钟。可以设想一下,如果开发每次修改代码都需要等待这么长的编译时间,那么就不会愿意频繁去触发编译来验证功能。

想要解决这个问题,采用组件化分而治之十分有效。另外,由于依赖的组件都是二进制格式,只能调用而无法修改原有组件的内容,这样能够减少代码被随意修改的风险。最重要的是,由于使用二进制依赖,可以对组件做二进制的版本管理,这样就能够更灵活组合各个组件的功能,而且当版本有问题时,也可以快速回滚集成之前的版本,重新发布。

当然,二进制依赖在带来灵活的版本管理时,也需要做一些额外的投入,主要是三个方面。

  • 第一,需要搭建二进制版本管理服务器,例如搭建 Maven 服务器来统一存放二进制组件以及管理组件的版本。
  • 第二,在组件的迭代上,也需要规划好组件各个版本的需求,并且做好组件的兼容性
  • 第三,在组件的二进制发布方面,也要结合持续集成流水线让组件发布的过程自动化。不然以前依赖源码的时候,只需要改代码马上就能验证。但是如果是二进制依赖的形式,改完代码以后还需要发布新的版本,然后调用的地方依赖新的版本才能验证,这也会影响开发的效率

三、Sharing 组件版本管理改造

以 Sharing 项目的日志组件为例,来看看如何做组件版本管理的改造。会使用 Maven 来管理组件二进制制品,为了方便演示,会使用本地 Maven 来配置,生成的制品会存储在本地的工程目录中。但在实际项目中,只需要把本地路径地址设置为自己搭建的 Maven 服务器的地址,就可以将制品发布到远程的服务中。这里我们的改造目标是,将日志组件发布到 Maven 仓库中,并将其他组件对日志组件的源码依赖调整为二进制依赖。

第一步,需要先在日志组件的 gradle 配置文件中引入 Maven 的插件,然后配置对应发布二进制组件所需要的 Maven 服务地址、组件名称以及版本号等信息,具体的配置代码是这样。

//日志组件所在目录的build.gralde 文件配置
apply plugin: 'maven'
 
group = 'com.jkb.junbin.sharing.library'
archivesBaseName = 'log'
version = '1.0.0'
 
repositories.mavenCentral()
 
uploadArchives {
   repositories.mavenDeployer {
       repository(url: 'file:'+ rootDir.getPath()+'/lib')
   }
}
 
//根目录的build.gralde 文件配置
 
allprojects {
    repositories {
        maven{
            url 'file:'+ rootDir.getPath()+'/lib'
        }
    }
}

配置完成后,就可以使用 gradle 命令来触发二进制制品的发布,代码是后面这样。

./gradlew :log:uploadArchives

成功执行完该命令以后,就可以在配置的本地地址目录下,找到对应生成的二进制文件,像后面这样。

在这里插入图片描述

最后一步,需要将之前依赖 log 组件源码的地方,调整为依赖生成的二进制制品。

implementation 'com.jkb.junbin.sharing.library:log:1.0.0'

当所有的调整完成以后,可以运行./gradlew testDUT 命令运行之前所有的测试,保证调整没有破坏架构规则以及业务功能。


四、总结

对于仓库管理来说,有 2 种常用的模式,分别为单仓模式以及多仓模式。

一张表,方便对比这 2 种分仓模式。

在这里插入图片描述

在实际项目中,可以根据代码以及团队成员的规模来选择合适的仓库管理模式,建议组件化项目初期采用单仓模式,等组件逐步稳定及团队规模达到一定的程度时采用分仓模式。

对于版本管理来说,采用二进制依赖的方式相比源码依赖能有效提高编译的效率。

另外,使用二进制依赖后,可以做组件的版本管理,这样可以更灵活地组合版本的功能。

在项目中,可以使用 Maven 来管理二进制制品的发布以及版本管理,具体可以参考Sharing 项目的改造示例。

如果组件已经是独立的仓库管理,而且组件间也都是二进制的依赖,那么日常开发中很重要的一项工作就是确保组件可以独立编译调试,避免每次都需要集成才能测试和验收。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【常见CSS扫盲雪碧图】从源码细看CSS雪碧图原理及实现,千字详解【附源码demo下载】

【写在前面】其实估计很多人都听过雪碧图,或者是CSS-Sprite,在很多门户网站就会经常有用到的,之所有引出雪碧图这个概念还得从前端加载多个图片时候页面闪了一下说起,这样给人的视觉效果体验很差,也就借此机会和大家说…

Linux查看串行端口

查看串口驱动 cat /proc/tty/driver/serial查看串口设备 dmesg | grep ttyS*[rootlocalhost driver]# cat /proc/tty/driver/serial serinfo:1.0 driver revision: 0: uart:16550A port:000003F8 irq:4 tx:0 rx:0 1: uart:16550A port:000002F8 irq:3 tx:0 rx:0 CTS|DSR|CD 2:…

攻防世界-inget(简单的SQL注入、万能密码)

目录 1、手工注入(万能密码原理) 2、sqlmap实现 3、常用参数 1、手工注入(万能密码原理) 打开链接,提示输入id并尝试绕过 尝试一下万能密码,使用逻辑语句使结果返回 构造payload /?id or 我们这里是…

Java虚拟机内存区域

Java虚拟机所管理的内存将会包括以下几个运行时数据区域 程序计数器 是一块较小的内存空间,可以看作当前线程所执行的字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要通过更改这个计数器的值来改变下一条需要执行的字节码。 由于各个线…

DAY 35 sed文本编辑器

文本三剑客:都是按行读取后处理。 grep 过滤行内容 awk 过滤字段 sed 过滤行内容;修改行内容 sed编辑器 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流 sed编辑器可以根据命令来处理数据流中的…

Shell编程(二)

上一章: Shell编程_做测试的喵酱的博客-CSDN博客 七、ping shell脚本,是一个面向过程的编程语言,没有类和对象的概念。用的最多的就是函数。 查看当前服务,是否能ping通baidu ping www.baidu.com [rootecs-39233 dev]# ping ww…

眺望2023:房企“三大护法”如何助力穿越周期?

2022 年的地产行业尤为艰难,土地和商品房成交量明显下滑,许多房企的业绩都呈现收缩态势。 不过,今年以来房地产市场似乎出现企稳信号。国家统计局数据显示,今年1~2月全国商品房销售面积和销售额的下跌幅度明显收窄,住…

18-java单列集合

java单列集合1.集合体系结构1.1 单列集合1.2 双列集合2. 单列集合体系结构3.Collection集合顶层接口3.1 Collection的遍历方法3.1.1 迭代器遍历3.1.2 增强for遍历3.1.3 Lambda表达式4. List单列集合4.1 List4.1.1 List集合特点4.1.2 List集合的特有方法4.1.3 List集合遍历方法4…

计算机组成原理实验三-----系统总线和具有基本输入输出功能的总线接口实验

总线是计算机中连接各个功能部件的纽带,是计算机各部件之间进行信息传输的公共通路。 总线不只是一组简单的信号传输线,它还是一组协议。他有两大特征 分时: 同一总线在同一时刻,只能有一个部件占领总线发送信息,其他部件要发送信…

游戏基础—Android平台进程模块信息获取

记得学习编程时的第一个helloworld程序&#xff1a; #include<stdio.h> Int main(int argc, char **argv) { printf(“Hello World”); return 0; } 打印” Hello World”&#xff0c;使用的是printf函数。但是&#xff0c;我们并没有去实现printf函数的功能&#xff0…

javascrip语法

JavaScript 语法涉及到很多方面&#xff0c;以下是常见的详细语法&#xff1a; 1. 变量 变量用于存放值&#xff0c;关键字 var 可以定义变量。 // javascript var x 5; // 定义变量 x&#xff0c;并赋值为 52. 数据类型 JavaScript 中有多种数据类型&#xff0c;包括&…

iOS 紧急通知

一般通知 关于通知的各种配置和开发&#xff0c;可以参考推送通知教程&#xff1a;入门 – Kodeco&#xff0c;具有详细步骤。 紧急通知表现 紧急通知不受免打扰模式和静音模式约束。当紧急通知到达时&#xff0c;会有短暂提示音量和抖动&#xff08;约2s&#xff09;。未锁…

一文速学数模-K-means聚类算法实战:信用卡用户画像聚类分析

目录 前言 一、用户画像概述 1.用户画像 2.为何用聚类算法作用户画像 二、数据质量校验 1.数据背景 2.数据说明 三、数据预处理 1.数据空缺值检验 2.数据归一化 四、K-means聚类 step1:选取K值 手肘法 step2:计算初始化K点 step3:迭代计算重新划分 五.画像分析 …

【LeetCode:221. 最大正方形 | 暴力递归=>记忆化搜索=>动态规划 | 二维dp】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Flutter - 实现防抖和节流

demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新&#xff0c;请前往github查看最新代码 什么是防抖和节流&#xff1f; 函数节流&#xff08;throttle&#xff09;与 函数防抖&#xff08;debounce&#xff09;都是为了限制函数的执行频次&#xff0c;以…

AgentGPT,免费易用的 Auto-GPT 平替

你问 ChatGPT 答&#xff0c;属于单线问答式交互。但如果你问Auto-GPT&#xff0c;他会分解成N个任务&#xff0c;并且在遇到任务无法完成后&#xff0c;会尝试其它的方式来完成任务&#xff0c;很像老板交待你一个任务&#xff0c;中间的过程他不过问&#xff0c;遇到问题你自…

性能测评:腾讯云轻量服务器4核8G12M带宽流量CPU主频型号

腾讯云轻量4核8G12M应用服务器带宽&#xff0c;12M公网带宽下载速度峰值可达1536KB/秒&#xff0c;折合1.5M/s&#xff0c;每月2000GB月流量&#xff0c;折合每天66GB&#xff0c;系统盘为180GB SSD盘&#xff0c;地域节点可选上海、广州或北京&#xff0c;4核8G服务器网来详细…

【LeetCode】917. 仅仅反转字母、387. 字符串中的第一个唯一字符

作者&#xff1a;小卢 专栏&#xff1a;《Leetcode》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 917. 仅仅反转字母 387. 字符串中的第一个唯一字符 917. 仅仅反转字母 917. 仅仅反转字母…

光栅和矢量图像处理SDK:Graphics Mill 11.7Crack

Graphics Mill 是适用于 .NET 和 ASP.NET 开发人员的最强大的成像工具集。它允许用户轻松地向 .NET 应用程序添加复杂的光栅和矢量图像处理功能。 光栅图形 加载和保存 JPEG、PNG PSD 和其他 8 种图像格式 调整大小、裁剪、自动修复、色度键和 30 多种其他图像处理 使用任何维度…

大电流的走线和过孔

工程师在设计的时候&#xff0c;很容易忽略走线宽度的问题&#xff0c;因为在数字设计时&#xff0c;走线宽度不在 考虑范围里面。通常情况下&#xff0c;都会尝试用最小的线宽去设计走线&#xff0c;这时&#xff0c;在大电流时&#xff0c;将会导致很严重的问题。下面的公式用…