V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
helee9199
V2EX  ›  Java

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

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

    我们做的项目,会有 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   ·   实用小工具   ·   1049 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:32 · PVG 05:32 · LAX 13:32 · JFK 16:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.