composer 依赖冲突怎么解决

2020-04-24 18:55:14 +08:00
 rikka
项目依赖 packageA 和 packageB 两个第三方包,然后这两个包又依赖另外一个包的不同版本
packageA ->packageC:1.x
packageB ->packageC:2.x
结果自然安装冲突失败
5448 次点击
所在节点    PHP
12 条回复
vigoss
2020-04-24 19:15:50 +08:00
fork 一份 A 或者 B,修改依赖。替换成你 fork 的。
HanSonJ
2020-04-24 19:17:48 +08:00
其中一个 package 换个可以兼容的版本,可以是 A 升级或 B 降级
rikka
2020-04-24 19:32:18 +08:00
@vigoss #1 fork 意味着我得自己维护这个包啊

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

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

```
"replace": {
"packageC": "1.x|2.x"
}
```
rikka
2020-04-25 17:02:50 +08:00
@zjsxwc #11 看了这个 replace 属性,可以在 AB 不知觉的情况下替换掉 C,替换为我自己实现的 packageC-polyfill,最终就是为了解决冲突,我自己得去维护这个 C,还是不太满意
不过在某些情况这个 replace 属性是有点用处,学习了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/665795

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX