请教一下大佬.我们这个情况应该如何设计

2022-07-01 17:27:07 +08:00
 helee9199

我们做的项目,会有 N 个客户. 然后最基本的功能都是一样的,然后再根据客户的需求去改 目前的做法是从最基本的那一份源码 X 从 X copy 一份成立 A 项目 从 X copy 一份成立 B 项目 ... 这个有一个问题就是,出现一个通用 bug 每个项目都要去改 所以老板希望可以改 1 处大家就能修复 不知道这种情况 应该如何设计调整呢?

2014 次点击
所在节点    Java
18 条回复
liupeng2579793
2022-07-01 17:38:45 +08:00
基础功能独立出来
DKrookie
2022-07-01 17:41:06 +08:00
我能想到的就是开分支,然后在新开的分支上作为这个客户的主分支开发,出现通用 bug ,在基础分支修改,然后 merge 就行了。然后用 husky 或者其他用得顺手的工具去限制 git 的一些操作,不允许将其他分支 merge 到基础分支。可以给每个客户的分支定一个前缀,前缀相同的分支才能合并,基础分支能够合并到任何分支。这只是我的想法,没有实践过。
zfjdif
2022-07-01 17:44:31 +08:00
之前见过讯飞类似的情况,一个 repo ,每个客户开一个分支,大概和二楼说的类似,但是具体如何管理的不太清楚
dwlovelife
2022-07-01 17:44:47 +08:00
代码一开始就不应该进行 copy 成一个项目,要么这部分代码要复用的部分抽成 jar 包,新起的项目引入 jar 包,然后进行复用。要么用设计模式 就在一个项目上 进行各种定制化的兼容。亦或,你们场景也可以做一份标准的客户需求,后续定制化的需求交给不同的团队的时候 就以各种 SPI 的接口方式进行嫁接。
dwlovelife
2022-07-01 17:46:58 +08:00
目前看 2 楼的方案 是最适合的 但是基础分支的代码既然已经有了 为啥不能更好的抽取出来 做复用 而要去这么麻烦的事
jjx
2022-07-01 17:50:03 +08:00
多层设计

axapta 就是这样, 一层一层的可以叠加

简单的就是二层, 基本的交付, git master 分支

然后是上面的定制层,这个层一开始是 0, 有定制再开发, 这个层同核心系统不搭

我们是通过 web 界面去定制这个层, 这个层可以形成一个项目, 有定制的 git 仓库存储


语言上 定制层通常使用动态语言实现
jjx
2022-07-01 17:52:10 +08:00
代码核心只有一个分支

定制层启动时从 db 等外部系统加载
定制时更新同步更新运行时定制层

代码查找优先从定制层查找,不存在在查找核心层
vvtf
2022-07-01 17:56:36 +08:00
我们是 X 是通用的; 有一个额外的组件是基于 jsr269 实现可以函数级别的定制化;
A 是基于 X 的, 也就是 dependency X 的. 所以如果 A 需要修改某个功能就修改某个函数即可; 不会修改 X; 增加功能也只需在 A 的项目里增加;
如果 X 出现 bug 了修改了 X 的代码, 再在 A 里面修改一下依赖即可;
这样每个项目的个性需求都是独立的没有影响;
ql562482472
2022-07-01 18:11:27 +08:00
我正在做这一块内容,我们是做产品的,但是客户定开也是个很重要的内容
kop1989smurf
2022-07-01 18:26:28 +08:00
1 、上策应该是所有项目共用一个工程,通过类似权限配置,功能开关来区分以及定制化。
2 、中策就是楼上多数人说的,核心引用相同的一个库文件 or 代码管理分支,然后每个项目是一个子分支。
3 、下策是做一个脚本或者工作流,一旦主工程有改动,自动同步给其他工程。
thinkershare
2022-07-01 18:26:55 +08:00
非常麻烦, 我们的很多项目也是这个性质, 一个 core 分支, 每个人一个 dev 分支, 一个 main 分支(合并每个人的开发), X 个定制分支, 非常烦, 每次为 core 做 fix 或者 feat 都要重新 rebase, 然后重新测试. 一直没找到好办法. 但项目性质决定了, 赚的就是给客户定制软件的费用, 维护麻烦也是要做的.
Huelse
2022-07-01 18:27:11 +08:00
做好抽象和分离工作,通过 git 子模块方式加载(指定分支)进行管理,主包下不同分支对应不同客户

再画个导图啥的就清晰了
tramm
2022-07-01 18:42:54 +08:00
可插拔式, 每个客户的特殊功能作为一个可插拔的"插件"
featureoverload
2022-07-01 18:50:38 +08:00
听说过动态链接库吗?(思想)
twing37
2022-07-02 01:17:38 +08:00
不知道你变得是什么. 如果是实体或者根本的业务逻辑. 那你多份本来就应该是独立的.

但是如果你每次变动的是可以拆出来基础功能.那就应该有个 workspace 去组织依赖.
5boy
2022-07-03 14:55:46 +08:00
sass 都是这样的吧
helee9199
2022-07-04 10:33:47 +08:00
@vvtf 目前的做法就是把 X 打成 jar 然后其他项目去引用他
可是这种搞法 修改一个字段, 页面微调 都需要重新 copy 了再调整。
随着时间 ,复写的越来越多, 而且开发起来 修改记录也不好看 找文件也不好找 真的是醉了。
主要是 项目也太老了 我估计十五年是有的。
vvtf
2022-07-04 13:05:51 +08:00
@helee9199 不需要 copy 了再调整,
调整的东西分 2 种:
1. 核心通用调整, 比如是 X 里面某个核心功能有 bug, 这时修改 X 即可, 然后 A 的依赖版本修改一下;
2. 定制化调整, 比如 A 的某个表多一个字段, 只需改 A 即可;
其实你也可以理解成上面 @tramm 所说的.
A 或者 B 其实就是一个插件, 默认是在 X 里面实现的.
A 或者 B 可以重写或者替换;

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/863492

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX