rikka
V2EX  ›  PHP

composer 依赖冲突怎么解决

  •  
  •   rikka · Apr 24, 2020 · 6217 views
    This topic created in 2276 days ago, the information mentioned may be changed or developed.
    项目依赖 packageA 和 packageB 两个第三方包,然后这两个包又依赖另外一个包的不同版本
    packageA ->packageC:1.x
    packageB ->packageC:2.x
    结果自然安装冲突失败
    Supplement 1  ·  Apr 24, 2020
    对于这种问题 npm 能解决,composer 似乎无解? PHP 这最好的包管理器就这样??
    好奇其他语言的包管理器能解决这种问题吗?
    12 replies    2020-04-25 17:02:50 +08:00
    leveraging
        1
    leveraging  
       Apr 24, 2020
    fork 一份 A 或者 B,修改依赖。替换成你 fork 的。
    HanSonJ
        2
    HanSonJ  
       Apr 24, 2020
    其中一个 package 换个可以兼容的版本,可以是 A 升级或 B 降级
    rikka
        3
    rikka  
    OP
       Apr 24, 2020
    @vigoss #1 fork 意味着我得自己维护这个包啊

    @HanSonJ #2 没兼容的版本怎么办
    zjsxwc
        4
    zjsxwc  
       Apr 24, 2020 via Android
    和 golang 那样处理
    dobelee
        5
    dobelee  
       Apr 24, 2020 via iPhone
    解决 json 的冲突,保留你想要的版本,干掉文件,重新安装。
    gouki
        6
    gouki  
       Apr 24, 2020
    js 可以 declare 方法,PHP 不行。所以你的想法在 PHP 中是行不通的。
    楼上的方法都不错。还有一种就是,可能你引用的类库太老了,居然不更新了,那你最好也别引用了。否则后面的坑可能会更多
    jfcherng
        7
    jfcherng  
       Apr 24, 2020
    你不想維護那就給作者發 PR 吧, 作者不理你那就換其他 lib
    rikka
        8
    rikka  
    OP
       Apr 24, 2020
    @jfcherng #7 这是无奈之举,根本问题是 composer 居然无法解决这种依赖问题,有点惊讶
    zjsxwc
        9
    zjsxwc  
       Apr 24, 2020 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
       Apr 25, 2020
    @zjsxwc #9 你忘了一点,我项目依赖 A,B 这两个第三方包,然后 A,B 又依赖了 C,这个 C 显然也是第三方的,这 3 个包我根本无法修改他们的依赖关系
    除非像 1L 楼说的 fork 一份出来修改
    zjsxwc
        11
    zjsxwc  
       Apr 25, 2020   ❤️ 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
       Apr 25, 2020
    @zjsxwc #11 看了这个 replace 属性,可以在 AB 不知觉的情况下替换掉 C,替换为我自己实现的 packageC-polyfill,最终就是为了解决冲突,我自己得去维护这个 C,还是不太满意
    不过在某些情况这个 replace 属性是有点用处,学习了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2828 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 08:06 · PVG 16:06 · LAX 01:06 · JFK 04:06
    ♥ Do have faith in what you're doing.