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

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

  •  
  •   helee9199 · 49 天前 · 1346 次点击
    这是一个创建于 49 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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


    语言上 定制层通常使用动态语言实现
    jjx
        7
    jjx  
       49 天前
    代码核心只有一个分支

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

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

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

    但是如果你每次变动的是可以拆出来基础功能.那就应该有个 workspace 去组织依赖.
    5boy
        16
    5boy  
       47 天前
    sass 都是这样的吧
    helee9199
        17
    helee9199  
    OP
       46 天前
    @vvtf 目前的做法就是把 X 打成 jar 然后其他项目去引用他
    可是这种搞法 修改一个字段, 页面微调 都需要重新 copy 了再调整。
    随着时间 ,复写的越来越多, 而且开发起来 修改记录也不好看 找文件也不好找 真的是醉了。
    主要是 项目也太老了 我估计十五年是有的。
    vvtf
        18
    vvtf  
       46 天前
    @helee9199 不需要 copy 了再调整,
    调整的东西分 2 种:
    1. 核心通用调整, 比如是 X 里面某个核心功能有 bug, 这时修改 X 即可, 然后 A 的依赖版本修改一下;
    2. 定制化调整, 比如 A 的某个表多一个字段, 只需改 A 即可;
    其实你也可以理解成上面 @tramm 所说的.
    A 或者 B 其实就是一个插件, 默认是在 X 里面实现的.
    A 或者 B 可以重写或者替换;
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1369 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 23:47 · PVG 07:47 · LAX 16:47 · JFK 19:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.