如何让composer自动解决不是真正冲突的冲突?

How to let composer automatically resolve conflicts that are not real conflicts?

composer 经常告诉我它不能安装某种包,因为它(的依赖项)与我已经安装的东西冲突。我常常搞不清冲突的正反面,但今天再次发生时,我仔细研究了一下,发现根本没有真正的冲突。

我想安装一个包,composer 说我想要的包依赖于 doctrine/inflector 版本 1.4 或更高版本,但我已经安装并锁定了 doctrine/inflector 1.3.1.

我调查了一下,我从未明确要求 doctrine/inflector。所以它不是我的应用程序的直接依赖项,而是作为我的两个依赖项的依赖项安装的。这两个依赖项表示他们需要 doctrine/inflector 版本分别为 ^1.2^1.0。 (我在 composer.lock 文件中找到了该信息。)

所以现在我不明白作曲家为什么要大惊小怪了。是的,composer 过去选择在 1.3.1 安装 doctrine/inflector 来满足要求,但是如果 composer 只是将它过去安装的 1.3.1 版本更新为 1.4.1。但它并没有这样做,而是抱怨有冲突。

我现在通过 运行 这些命令手动解决了冲突:

$ composer require doctrine/inflector:1.4.1
$ composer require illuminate/support
$ composer remove doctrine/inflector

我使用了 doctrine remove,因为我不想在我的 composer.json 中使用 doctrine/inflector

当然可以,但是有没有办法配置 composer 使其尝试自行解决这些冲突?因为我确信有更复杂的场景,我无法弄清楚该怎么做,但作曲家如果愿意尝试的话可能可以。

我在该站点上进行了一些搜索,发现 composer update 可能对我有所帮助,但我仍然很想知道是否有更好的选择。你看,我正在寻找一种方法,其中 不需要知道哪些包需要更新(而且我也不需要更新我所有的包)。

您可以使用这些标志 composer require 实现此目的:

$ composer require --help | grep update-with
      --update-with-dependencies      Allows inherited dependencies to be updated, except those that are root requirements.
      --update-with-all-dependencies  Allows all inherited dependencies to be updated, including those that are root requirements.

遇到了完全相同的问题。这似乎是作曲家 1 的不良行为。

切换到 composer 2 解决了这个问题,选项 --update-with-all-dependencies (-W) 完成了它的工作!

否则,对于 composer 1,唯一的解决方案似乎是您所做的:手动更新依赖项、子依赖项、子子...并在最后 composer.json 中删除它们。