Composer php Composer两个软件包在依赖项版本上冲突

Composer php Composer两个软件包在依赖项版本上冲突,composer-php,guzzle,Composer Php,Guzzle,我已经安装了软件包。当我不久前安装它时,它需要guzzle 3.*所以它安装guzzle 3.9.1作为它的一个依赖项 现在我想安装这个包,所以我将它添加到composer.json中 "require": { ... ... "geoip2/geoip2": "0.6.*", "predictionio/predictionio": "~0.7.1" } 问题是需要guzzle 3.8.0或3.8.1,它不接受已安装的3.9.1版本 我相信3.8.0会同时满足

我已经安装了软件包。当我不久前安装它时,它需要guzzle 3.*所以它安装guzzle 3.9.1作为它的一个依赖项

现在我想安装这个包,所以我将它添加到composer.json中

"require": {
    ...
    ...
    "geoip2/geoip2": "0.6.*",
    "predictionio/predictionio": "~0.7.1"
}
问题是需要guzzle 3.8.0或3.8.1,它不接受已安装的3.9.1版本

我相信3.8.0会同时满足和,所以问题是我如何降级,记住我的composer.json中没有出现,只有composer.lock

下面是我运行
composer update predictionio/predictionio

  Problem 1
    - Installation request for predictionio/predictionio ~0.7.1 -> satisfiable by predictionio/predictionio[v0.7.1].
    - Conclusion: remove guzzle/guzzle v3.9.1
    - predictionio/predictionio v0.7.1 requires guzzle/guzzle ~3.8.0 -> satisfiable by guzzle/guzzle[v3.8.0, v3.8.1].
    - Can only install one of: guzzle/guzzle[v3.9.1, v3.8.0].
    - Can only install one of: guzzle/guzzle[v3.9.1, v3.8.1].
    - Installation request for guzzle/guzzle == 3.9.1.0 -> satisfiable by guzzle/guzzle[v3.9.1].

您不需要将Guzzle添加到
composer.json
。您所要做的就是在添加新包时更新Guzzle。(这将降低Guzzle,以符合PredictionIO的要求)

简单运行

composer update predictionio/predictionio guzzle/guzzle

如您所见,您可以通过用空格分隔多个包来为
composer update
提供多个包。如中所述。

如果要安装特定版本的软件包,只需将其添加到require部分的composer.json中即可:

然后

  composer update guzzle/guzzle

与该问题相关的一些提示:

通过运行名为/package的composer update,您只允许添加此包或增加其版本,而不允许添加其他内容。同样(但仅添加内容)也会发生在
composer require named/package:~1.0
(这是一种添加内容而不必弄乱json格式的好方法)

更新内容时最简单的解决方案是只运行
composer update
。如果没有包名,所有包都可能被更新

如果您在选择软件包时不小心,那么更新所有内容可能会有点风险。我个人建议使用某种程度上似乎使用语义版本控制的软件,这非常好地允许在Composer中使用tilde版本要求。我想说的是,每个人都应该尝试使用
~X.Y
作为版本描述,因为这样既可以安装补丁,也可以安装兼容的更新

您使用的库应该允许有足够的松散定义版本的依赖项。在您的示例中,
predictionio/predictionio
包需要
guzzle/guzzle:~3.8.0
——它们可能有这样做的理由,但反过来会迫使所有试图使用其软件的人使用guzzle 3.8.0或3.8.1。我怀疑Guzzle的维护人员是否会破坏向后兼容性,因为他们知道他们创建了一个非常重要的、基本的、预期可以工作的软件,我认为如果他们破坏了这些东西,他们很快就会收到错误报告。我非常希望看到任何库的依赖关系,以允许无限制地进行兼容更新,即在这种情况下,
~3.8
会更好


避免不惜一切代价依赖分支机构。如果不可避免地要使用分支,请为其指定别名版本号:
require:{“named/package”:“dev master as 1.2.2”}
如果无法从早期版本猜出正确的版本号,请从0.0.0开始。这样,您可以稍后切换到已发布的版本,这将更好地集成到其他版本号中。

感谢您的建议,但我运行了
composer update predictionio/predictionio geoip2/geoip2
,它给出了与问题中所示相同的输出。对不起,您是对的。然而,运行
composer update predictionio/predictionio guzzle/guzzle
应该可以做到这一点(我刚刚测试了它,它对我很有效)。我更新了答案。谢谢你的回答,我还没有尝试过这个,但看起来应该可以。
  composer update guzzle/guzzle