请教一下大佬.我们这个情况应该如何设计 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
helee9199
V2EX    Java

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

  •  
  •   helee9199 2022-07-01 17:27:07 +08:00 2690 次点击
    这是一个创建于 1200 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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


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

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

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

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

    但是如果你每次变动的是可以拆出来基础功能.那就应该有个 workspace 去组织依赖.
    5boy
        16
    5boy  
       2022-07-03 14:55:46 +08:00
    sass 都是这样的吧
    helee9199
        17
    helee9199  
    OP
       2022-07-04 10:33:47 +08:00
    @vvtf 目前的做法就是把 X 打成 jar 然后其他项目去引用他
    可是这种搞法 修改一个字段, 页面微调 都需要重新 copy 了再调整。
    随着时间 ,复写的越来越多, 而且开发起来 修改记录也不好看 找文件也不好找 真的是醉了。
    主要是 项目也太老了 我估计十五年是有的。
    vvtf
        18
    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 可以重写或者替换;
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5843 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 01:36 PVG 09:36 LAX 18:36 JFK 21:36
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86