Composer php 使用Composer解决依赖性地狱

Composer php 使用Composer解决依赖性地狱,composer-php,Composer Php,情况就是这样 您的composer.json中有包A和包B(您的应用程序依赖于这两个包) 包A和包B都依赖于包C,但版本不同。假设A依赖于cv2.1,B依赖于cv2.2 你会遇到版本冲突 A、B和C都是第三方软件包 如何解决这个问题?这是一个黑客攻击,但可能会让你继续前进 您可以覆盖“A”、“B”和“C”包的存储库,并使“A”和“B”依赖于同一版本的“C”(实际上,只覆盖“A”和“B”的存储库就足够了) 只要“A”和“B”都能与最新版本的“C”一起使用(因此可能是维护人员没有更新软件包版本),就

情况就是这样

您的composer.json中有包A和包B(您的应用程序依赖于这两个包)

包A和包B都依赖于包C,但版本不同。假设A依赖于cv2.1,B依赖于cv2.2

你会遇到版本冲突

A、B和C都是第三方软件包


如何解决这个问题?

这是一个黑客攻击,但可能会让你继续前进

您可以覆盖“A”、“B”和“C”包的存储库,并使“A”和“B”依赖于同一版本的“C”(实际上,只覆盖“A”和“B”的存储库就足够了)


只要“A”和“B”都能与最新版本的“C”一起使用(因此可能是维护人员没有更新软件包版本),就应该可以使用。如果是这样的话,我也会考虑向一个有一个旧版本的依赖项的项目发送一个拉请求。

我们在邮件列表中讨论:


“无冲突”技术必须在PHP中实现,这不是编写器的错误

a或B是否可以使用相同版本的C?我知道这些包强制使用不同的版本,但您可能可以在composer.json中为这三个包定义存储库,以覆盖这些版本。我知道这是一个黑客,但它可以让你走。是的。但我不确定你能做到。我试试看。但是我知道,如果你把composer.json
“C”:“2.2”
,和have
“C”:“2.1”
,你会得到错误。是的,但我的想法是为所有三个包定义存储库。因此,您将A和B更改为依赖于“C”:“2.2”。只要两者都能使用2.2…啊,是的,这可能会解决它。你可以把答案贴出来,这样我就可以接受了。谢谢。为什么composer不允许包A和包B依赖于同一包的不同版本。NPM能够做到这一点:他们只需要某种嵌套的供应商结构!另外,您是否能够在composer.json中给出一个关于如何覆盖存储库以解决依赖关系冲突的示例?我认为这是一个概念性问题,即在自动加载libs时分离依赖关系管理和缺少上下文。即使php提供了一种简单的方法,在同一请求中包含具有不同版本的相同库(例如,composer loader会将版本导出到单独的名称空间),您仍然需要以某种方式将LIB中的调用映射到正确的依赖项版本。@Tyrael这似乎是个小问题;您可以为包的根命名空间设置别名,以便FQN包含包版本,但以正常方式引用。e、 g./Vendor/Package/1.0.0/别名为/Vendor/Package/;尽管我认为您需要限制独立安装的版本更改,小版本只是覆盖现有版本。