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

composer 依赖冲突怎么解决

  •  
  •   rikka · 2020-04-24 18:55:14 +08:00 · 5611 次点击
    这是一个创建于 1699 天前的主题,其中的信息可能已经有所发展或是发生改变。
    项目依赖 packageA 和 packageB 两个第三方包,然后这两个包又依赖另外一个包的不同版本
    packageA ->packageC:1.x
    packageB ->packageC:2.x
    结果自然安装冲突失败
    第 1 条附言  ·  2020-04-24 19:38:54 +08:00
    对于这种问题 npm 能解决,composer 似乎无解? PHP 这最好的包管理器就这样??
    好奇其他语言的包管理器能解决这种问题吗?
    12 条回复    2020-04-25 17:02:50 +08:00
    vigoss
        1
    vigoss  
       2020-04-24 19:15:50 +08:00
    fork 一份 A 或者 B,修改依赖。替换成你 fork 的。
    HanSonJ
        2
    HanSonJ  
       2020-04-24 19:17:48 +08:00
    其中一个 package 换个可以兼容的版本,可以是 A 升级或 B 降级
    rikka
        3
    rikka  
    OP
       2020-04-24 19:32:18 +08:00
    @vigoss #1 fork 意味着我得自己维护这个包啊

    @HanSonJ #2 没兼容的版本怎么办
    zjsxwc
        4
    zjsxwc  
       2020-04-24 19:34:49 +08:00 via Android
    和 golang 那样处理
    dobelee
        5
    dobelee  
       2020-04-24 19:37:00 +08:00 via iPhone
    解决 json 的冲突,保留你想要的版本,干掉文件,重新安装。
    gouki
        6
    gouki  
       2020-04-24 20:57:32 +08:00
    js 可以 declare 方法,PHP 不行。所以你的想法在 PHP 中是行不通的。
    楼上的方法都不错。还有一种就是,可能你引用的类库太老了,居然不更新了,那你最好也别引用了。否则后面的坑可能会更多
    jfcherng
        7
    jfcherng  
       2020-04-24 21:20:17 +08:00
    你不想維護那就給作者發 PR 吧, 作者不理你那就換其他 lib
    rikka
        8
    rikka  
    OP
       2020-04-24 21:45:51 +08:00
    @jfcherng #7 这是无奈之举,根本问题是 composer 居然无法解决这种依赖问题,有点惊讶
    zjsxwc
        9
    zjsxwc  
       2020-04-24 23:02:13 +08:00 via Android
    symfony 的做法是在高版本里增加 polyfill 兼容代码,比如你创建个 packageC-polyfill 三方项目,
    这个三方项目的作用就是让你的 packageC:2.x 兼容 packageC:1.x,
    然后让 packageA 依赖下 packageC:2.x,
    以及让 packageC:2.x 依赖你的 packageC-polyfill
    rikka
        10
    rikka  
    OP
       2020-04-25 00:33:44 +08:00
    @zjsxwc #9 你忘了一点,我项目依赖 A,B 这两个第三方包,然后 A,B 又依赖了 C,这个 C 显然也是第三方的,这 3 个包我根本无法修改他们的依赖关系
    除非像 1L 楼说的 fork 一份出来修改
    zjsxwc
        11
    zjsxwc  
       2020-04-25 08:50:45 +08:00   ❤️ 1
    @rikka
    可以试试用 replace 属性,写一个三方包同时代替 packageC:1.x 与 packageC:2.x

    http://blog.ifeeline.com/2695.html

    ```
    "replace": {
    "packageC": "1.x|2.x"
    }
    ```
    rikka
        12
    rikka  
    OP
       2020-04-25 17:02:50 +08:00
    @zjsxwc #11 看了这个 replace 属性,可以在 AB 不知觉的情况下替换掉 C,替换为我自己实现的 packageC-polyfill,最终就是为了解决冲突,我自己得去维护这个 C,还是不太满意
    不过在某些情况这个 replace 属性是有点用处,学习了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1052 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:42 · PVG 06:42 · LAX 14:42 · JFK 17:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.